0

所以我有两个数据框,我试图通过一列加入。但是,这两个数据帧之间的公共列是不同的,其中一个数据帧中的值是全名,而另一个数据帧中的值是缩写。我正在尝试制作某种映射字典,将名称等同于它们的缩写,因此数据框可以通过这个公共列直接连接。我将在下面进一步解释。

我有这个数据框(A):

    Building         Style           CO2       NOx
---------------------------------------------------
Multi-Family             A            34        55
Multi-Family             B            43        44
Multi-Family             C            33        35 
Single-Family            A            34        26
Single-Family            B            22        26
Single-Family            C            65        48
Single-Family            D            55        74 
Studio                   A            46        35 
Studio                   B            54        67
Studio                   C            57        58

然后我有这个数据框(B):

Building   Style    Zip_code     Number
---------------------------------------
      MF       A       11111         4 
      MF       A       22222         3
      MF       A       33333         2
      MF       B       11111         1
      MF       B       22222         1
      MF       C       22222         1 
      MF       C       33333         6
      SF       A       11111         7 
      SF       A       22222         5
      SF       B       44444         3
      SF       B       55555         8 
      SF       B       66666         6
      SF       C       11111         9
      SF       C       22222         9
      ST       A       33333         3
      ST       A       44444         5
      ST       B       55555         5
      ST       B       66666         3
      ST       C       11111         2 
      ST       C       22222         9 
      ST       C       33333         1

现在我想创建以下数据框(C):

Zip_code      CO2    NOx
-------------------------
11111           ?      ?
22222           ?      ?
33333           ?      ?
44444           ?      ?
55555           ?      ?
66666           ?      ?

我将进一步解释这一点。我有建筑物的数据,显示对应于 3 种类型建筑物的 3 种类型建筑物的 CO2 和 NOx 排放(数据框 A)。然后我有数据显示在每个列出的邮政编码(数据框 B)中有多少这些类型的房屋。我最终想创建一个数据框,显示每个邮政编码的总排放量,包括二氧化碳和氮氧化物(数据框 C)。获取 Dataframe C 背后的想法是,我想生成一个数据框,然后可以通过邮政编码将其连接到 GIS shapefile,这样我就可以绘制每个邮政编码中的 CO2 和 NOx 排放量,获得要加入的空白邮政编码 shapefile至。(我意识到映射排放比这复杂得多,但我在项目的这个阶段保持这个简单)。

所以我想要做的是在“建筑”列上将数据框 A 连接到数据框 B。但问题是 Dataframe A 中的“Building”列的名称是完整的,而 Dataframe B 中的“Building”列的名称是缩写。我想我需要创建某种字典,将全名与其要引用的缩写相匹配,但我不知道如何将其放入此处。

这可以在python中完成吗?还是这实际上比我想象的要复杂得多?我花了好几个小时试图围绕如何合并这两个数据框来思考,但每次我都会变得更加困惑。我在概念化这段代码的样子时遇到了很多麻烦,即使目标看起来很简单。我将不胜感激任何帮助或指导!很抱歉让这些数据帧这么长,但我觉得有必要捕捉数据的结构/复杂性。

谢谢!

4

1 回答 1

1

这当然是可能的。您确实可以首先使用自定义函数将建筑物名称转换为缩写,该函数在连字符上拆分并获取每个单词的第一个字母。然后,您可以合并 和 上的数据BuildingStyle。最后你groupby可以Zip-code

import pandas as pd

data1 = [ { "Building": "Multi-Family", "Style": "A", "CO2": 34, "NOx": 55 }, { "Building": "Multi-Family", "Style": "B", "CO2": 43, "NOx": 44 }, { "Building": "Multi-Family", "Style": "C", "CO2": 33, "NOx": 35 }, { "Building": "Single-Family", "Style": "A", "CO2": 34, "NOx": 26 }, { "Building": "Single-Family", "Style": "B", "CO2": 22, "NOx": 26 }, { "Building": "Single-Family", "Style": "C", "CO2": 65, "NOx": 48 }, { "Building": "Single-Family", "Style": "D", "CO2": 55, "NOx": 74 }, { "Building": "Studio", "Style": "A", "CO2": 46, "NOx": 35 }, { "Building": "Studio", "Style": "B", "CO2": 54, "NOx": 67 }, { "Building": "Studio", "Style": "C", "CO2": 57, "NOx": 58 } ]
data2 = [ { "Building": "MF", "Style": "A", "Zip_code": 11111, "Number": 4 }, { "Building": "MF", "Style": "A", "Zip_code": 22222, "Number": 3 }, { "Building": "MF", "Style": "A", "Zip_code": 33333, "Number": 2 }, { "Building": "MF", "Style": "B", "Zip_code": 11111, "Number": 1 }, { "Building": "MF", "Style": "B", "Zip_code": 22222, "Number": 1 }, { "Building": "MF", "Style": "C", "Zip_code": 22222, "Number": 1 }, { "Building": "MF", "Style": "C", "Zip_code": 33333, "Number": 6 }, { "Building": "SF", "Style": "A", "Zip_code": 11111, "Number": 7 }, { "Building": "SF", "Style": "A", "Zip_code": 22222, "Number": 5 }, { "Building": "SF", "Style": "B", "Zip_code": 44444, "Number": 3 }, { "Building": "SF", "Style": "B", "Zip_code": 55555, "Number": 8 }, { "Building": "SF", "Style": "B", "Zip_code": 66666, "Number": 6 }, { "Building": "SF", "Style": "C", "Zip_code": 11111, "Number": 9 }, { "Building": "SF", "Style": "C", "Zip_code": 22222, "Number": 9 }, { "Building": "ST", "Style": "A", "Zip_code": 33333, "Number": 3 }, { "Building": "ST", "Style": "A", "Zip_code": 44444, "Number": 5 }, { "Building": "ST", "Style": "B", "Zip_code": 55555, "Number": 5 }, { "Building": "ST", "Style": "B", "Zip_code": 66666, "Number": 3 }, { "Building": "ST", "Style": "C", "Zip_code": 11111, "Number": 2 }, { "Building": "ST", "Style": "C", "Zip_code": 22222, "Number": 9 }, { "Building": "ST", "Style": "C", "Zip_code": 33333, "Number": 1 } ]
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)

def shorten_buildings(text):
    text = ''.join([i[0] for i in text.split('-')])
    return text if text != 'S' else 'ST'

df1['Building'] = df1['Building'].apply(shorten_buildings)

df2 = df2.merge(df1,  how='left', on=['Building','Style'])

df2['CO2'] = df2['Number'] * df2['CO2'] #total CO2
df2['NOx'] = df2['Number'] * df2['NOx'] #total NOx
df2.groupby(['Zip_code']).sum().drop('Number', axis=1)

输出:

邮政编码 二氧化碳 氮氧化物
11111 1116 994
22222 1446 1328
33333 461 483
44444 296 253
55555 446 543
66666 294 357
于 2021-06-08T19:35:11.243 回答