如何合并/连接两个不同长度的熊猫数据框?
Posted
技术标签:
【中文标题】如何合并/连接两个不同长度的熊猫数据框?【英文标题】:How to merge / concat two pandas dataframes with different length? 【发布时间】:2018-10-02 00:52:28 【问题描述】:我想合并/合并两个 pandas 数据框,但我没有得到正确的结果。我有以下数据框:
df1
Username | User_trim
-------------------------------
0 Maria M | Maria
1 FakeName | N/A
2 Achim B | Achim
3 FlashMaster11 | N/A
4 Fakename2 | N/A
5 Gustav W | Gustav
df2
0 |1 | 2
---------------------------------
0 Maria M | Maria | female
2 Achim B | Achim | male
5 Gustav W | Gustav | male
我想要以下结果数据框:
Username | User_trim | Gender
---------------------------------
0 Maria M | Maria | female
1 FakeName | N/A | N/A
2 Achim B | Achim | male
3 FlashMaster11 | N/A | N/A
4 Fakename2 | N/A | N/A
5 Gustav W | Gustav | male
我尝试了以下代码
result = pd.concat([df1,df2], axis=1,ignore_index=True)
但我得到了错误的结果,但表格的长度正确。所以我尝试了这个:
df1.merge(df2,how='outer', left_on='Username', right_on=0)
这段代码似乎我得到了正确的结果,但表格比 df1 大(我的意思是行)?
当我合并数据框并获取所有列时,我没有问题。我可以放下它们。问题只是将它们以不同的长度合并并将它们放在正确的行中。
有没有人可以给我一个建议,我怎样才能得到结果表?
【问题讨论】:
如果我或其他答案有帮助,请不要忘记accept 它 - 单击答案旁边的复选标记可将其从灰色切换为已填充。只应接受一个答案。谢谢。 【参考方案1】:我认为在merge
中需要left join
:
df = df1.merge(df2,how='left', left_on='Username', right_on=0)
print (df)
Username User_trim 0 1 2
0 Maria M Maria Maria M Maria female
1 FakeName NaN NaN NaN NaN
2 Achim B Achim Achim B Achim male
3 FlashMaster11 NaN NaN NaN NaN
4 Fakename2 NaN NaN NaN NaN
5 Gustav W Gustav Gustav W Gustav male
如果需要通过merge
追加新列而不删除不必要的列的解决方案是首先rename
至少一个列用于连接(这里Username
在两个DataFrame
s 中),然后选择所有必要的列(总是加入列 + 所有其他新列):
df22 = df2.rename(columns=0:'Username', 2:'Gender')[['Username', 'Gender']]
print (df22)
Username Gender
0 Maria M female
1 Achim B male
2 Gustav W male
df = df1.merge(df22,how='left', on='Username')
print (df)
Username User_trim Gender
0 Maria M Maria female
1 FakeName NaN NaN
2 Achim B Achim male
3 FlashMaster11 NaN NaN
4 Fakename2 NaN NaN
5 Gustav W Gustav male
如果只需要添加一个新列,请使用由Series
创建的map
set_index
:
df1['Gender'] = df1['Username'].map(df2.set_index(0)[2])
print (df1)
Username User_trim Gender
0 Maria M Maria female
1 FakeName NaN NaN
2 Achim B Achim male
3 FlashMaster11 NaN NaN
4 Fakename2 NaN NaN
5 Gustav W Gustav male
【讨论】:
【参考方案2】:由于您的索引已经对齐,您可以对齐列名,然后使用pd.DataFrame.combine_first
:
df2 = df2.rename(columns=0: 'Username', 1: 'User_trim', 2: 'Gender')
res = df1.combine_first(df2)
print(res)
# Gender User_trim Username
# 0 female Maria Maria M
# 1 NaN N/A FakeName
# 2 male Achim Achim B
# 3 NaN N/A FlashMaster11
# 4 NaN N/A Fakename2
# 5 male Gustav Gustav W
【讨论】:
以上是关于如何合并/连接两个不同长度的熊猫数据框?的主要内容,如果未能解决你的问题,请参考以下文章