如何合并/连接两个不同长度的熊猫数据框?

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 在两个DataFrames 中),然后选择所有必要的列(总是加入列 + 所有其他新列):

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

【讨论】:

以上是关于如何合并/连接两个不同长度的熊猫数据框?的主要内容,如果未能解决你的问题,请参考以下文章

不能连接相同长度的熊猫数据帧?

如何合并多维数据框和不同长度的系列?

合并 pandas 中列名不同且长度不同的两个数据框

当两个数据框都包含重复键时,如何将两个熊猫数据框与左连接合并?

如何使用 Python 合并或使用字符串连接两个熊猫数据框

熊猫合并:合并同一列上的两个数据框,但保留不同的列