Python 合并长度不等的数据帧
我有两个数据帧,我想合并成一个。它们的长度不等,但包含一些相同的信息 以下是第一个数据帧:Python 合并长度不等的数据帧,python,pandas,dataframe,merge,Python,Pandas,Dataframe,Merge,我有两个数据帧,我想合并成一个。它们的长度不等,但包含一些相同的信息 以下是第一个数据帧: BOROUGH TYPE TCOUNT MAN SPORT 5 MAN CONV 3 MAN WAGON 2 BRO SPORT 2 BRO CONV 3 其中列A指定位置,B指定类别,C指定计数 第二点: BOROUGH CAUSE CCOUNT MAN ALCOHOL 5 MAN SIZE
BOROUGH TYPE TCOUNT
MAN SPORT 5
MAN CONV 3
MAN WAGON 2
BRO SPORT 2
BRO CONV 3
其中列A
指定位置,B
指定类别,C
指定计数
第二点:
BOROUGH CAUSE CCOUNT
MAN ALCOHOL 5
MAN SIZE 3
BRO ALCOHOL 2
此处A
与另一个数据帧中的位置相同。但是D
是另一个类别,E
是该位置D
的计数
我想要(但一直未能做到)的是获得以下内容:
BOROUGH TYPE TCOUNT CAUSE CCOUNT
MAN SPORT 5 ALCOHOL 5
MAN CONV 3 SIZE 3
MAN WAGON 2 NaN NaN
BRO SPORT 2 ALCOHOL 2
BRO CONV 3 NaN NaN
“-”可以是任何东西。最好是说“什么都没有”的字符串。如果它们默认为NaN值,我想这只是用字符串替换它们的问题
编辑:输出:
INT64索引:233个条目,0到232
数据列(共3列):
自治区233非空对象
促成因素车辆1233非空对象
RCOUNT 233非空int64
数据类型:int64(1),对象(2)
内存使用率:7.3+KB
没有一个
INT64索引:83个条目,从0到82
数据列(共3列):
自治区83非空对象
车辆类型代码1 83非空对象
VCOUNT 83非空int64
数据类型:int64(1),对象(2)
内存使用率:2.6+KB
没有一个
在列“a”和列“B”上执行左
键入,因为列“a”和列“B”是左侧的,列“a”和列“D”是右侧的,因为它们是您的关键列
In [16]:
df.merge(df1, left_on=['A','B'], right_on=['A','D'], how='left')
Out[16]:
A B C D E
0 1 1 3 1 5
1 1 2 2 2 3
2 1 3 1 NaN NaN
3 2 1 1 1 2
4 2 2 4 NaN NaN
编辑
您的问题已更改,但基本上您可以在此处先使用combine\u
:
In [26]:
merged = df.combine_first(df1)
merged
Out[26]:
BOROUGH CAUSE CCOUNT TCOUNT TYPE
0 MAN ALCOHOL 5 5 SPORT
1 MAN SIZE 3 3 CONV
2 MAN ALCOHOL 2 2 WAGON
3 BRO NaN NaN 2 SPORT
4 BRO NaN NaN 3 CONV
您看到的'CAUSE'的NaN
是字符串'NaN',我们可以使用fillna
替换这些值:
In [27]:
merged['CAUSE'] = merged['CAUSE'].fillna('Nothing')
merged['CCOUNT'] = merged['CCOUNT'].fillna(0)
merged
Out[27]:
BOROUGH CAUSE CCOUNT TCOUNT TYPE
0 MAN ALCOHOL 5 5 SPORT
1 MAN SIZE 3 3 CONV
2 MAN ALCOHOL 2 2 WAGON
3 BRO Nothing 0 2 SPORT
4 BRO Nothing 0 3 CONV
pd.merge(df_One,df_Two,left_on=['A','B'],right_on=['A','D'])你能试试这个吗?好的,我看到你的问题了,df1有233行,但df2只有83行,所以由于长度不相等,你会得到空值,你期待什么,因为我期待这是预期的操作我希望我能合并两个数据帧。基本上填充df2中所有缺失的值。因此,如果df1有47个BRONX值,而df2只有17个,我会用[BRONX,NOTHING,0]填充df2中剩余的30个值。然后我就可以合并这两个数据帧了。这同样适用于其他自治区、皇后区、曼哈顿、布鲁克林和斯塔顿岛,因为在df2中,您有多个自治区条目,所以不清楚应该匹配哪个条目,所以如果您选择了
df1.merge(df2,how='left)
这将生成一个包含3869行的df,因此您必须清理数据或决定加入/合并的其他条件。这与熊猫无关。这是一个数据问题。那么,使用两个独立的数据帧可能会更容易。感谢您抽出时间思考A是否真的包含字符串有关系?因为我的D和E都被设置为NaN。B和D也是字符串如果数据类型不同,则列数据类型会混合显示为对象
,尽管这是预期的,但在与数值和字符串值进行比较时可能会出现问题,并且输出显示的内容看起来像数值/字符串,但实际上是其他内容,最好使用同质的数据类型,以避免这种混淆。我认为在这种情况下,这不重要,因为您没有合并这样的值,只要键列数据类型一致,那么上面的数据类型就不应该同时适用于A、B、D都是字符串。C和E是整数。我想这就是造成问题的原因吧?不知道为什么它不起作用,当您缺少值时,它会将数据类型转换为float以表示NaN
这是预期的行为,因为NaN
不能在int
中表示,您可以调用fillna
填充缺少的值,然后使用astype(int)强制转换数据类型
在这些列上
In [27]:
merged['CAUSE'] = merged['CAUSE'].fillna('Nothing')
merged['CCOUNT'] = merged['CCOUNT'].fillna(0)
merged
Out[27]:
BOROUGH CAUSE CCOUNT TCOUNT TYPE
0 MAN ALCOHOL 5 5 SPORT
1 MAN SIZE 3 3 CONV
2 MAN ALCOHOL 2 2 WAGON
3 BRO Nothing 0 2 SPORT
4 BRO Nothing 0 3 CONV