【问题标题】:With pd.merge() on different column names, the resulting dataframe has duplicated columns. How to avoid that?在不同的列名上使用 pd.merge() 时,生成的数据框具有重复的列。如何避免这种情况?
【发布时间】:2021-02-04 04:51:14
【问题描述】:

假设下面的数据帧 df_1 和 df_2,我想合并“左”。

df_1= pd.DataFrame({'A': [1,2,3,4,5],
                    'B': [10,20,30,40,50]})
df_2= pd.DataFrame({'AA': [1,5],
                    'BB': [10,50],
                    'CC': [100, 500]})
>>> df_1
   A   B
0  1  10
1  2  20
2  3  30
3  4  40
4  5  50

>>> df_2
   AA  BB   CC
0   1  10  100
1   5  50  500

我想执行合并,这将导致以下输出:

   A   B     CC
0  1  10  100.0
1  2  20    NaN
2  3  30    NaN
3  4  40    NaN
4  5  50  500.0

所以,我尝试了pd.merge(df_1, df_2, left_on=['A', 'B'], right_on=['AA', 'BB'], how='left'),不幸的是它重复了我合并的列:

   A   B   AA    BB     CC
0  1  10  1.0  10.0  100.0
1  2  20  NaN   NaN    NaN
2  3  30  NaN   NaN    NaN
3  4  40  NaN   NaN    NaN
4  5  50  5.0  50.0  500.0

如何在不删除“AA”和“BB”列的情况下实现这一点?

谢谢!

【问题讨论】:

标签: python pandas dataframe merge duplicates


【解决方案1】:

您只能使用rename 并通过A, B 列加入:

df = pd.merge(df_1, df_2.rename(columns={'AA':'A','BB':'B'}), on=['A', 'B'], how='left') 
print (df)
   A   B     CC
0  1  10  100.0
1  2  20    NaN
2  3  30    NaN
3  4  40    NaN
4  5  50  500.0

【讨论】:

  • 这只是一个例子,我的真实数据框有更多的列,重命名非常耗时。谢谢...
【解决方案2】:

pd.mergeright_on 参数中接受类数组 参数。

也可以是右边DataFrame长度的数组或数组列表。这些数组被视为列。

df_1.merge(
    df_2["CC"], left_on=["A", "B"], right_on=[df_2["AA"], df_2["BB"]], how="left"
)

  A   B     CC
0  1  10  100.0
1  2  20    NaN
2  3  30    NaN
3  4  40    NaN
4  5  50  500.0
  • df.merge(sec_df)sec_df 没有要合并的列名。
  • rigth_on 作为一个 list 与要合并的列,[df_2['AA'], df_2['BB']] 相当于 [*df_2[['AA', 'BB']].to_numpy()]

恕我直言,这种方法很麻烦。正如@jezrael 发布的重命名列并合并它们是 pythonic/pandorable

【讨论】:

  • @jezrael 是的,我最近也发现了这个:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
  • 2020-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
相关资源
最近更新 更多