【问题标题】:Pandas merge on first column熊猫在第一列合并
【发布时间】:2019-08-01 11:00:57
【问题描述】:

我正在尝试在我尝试合并的条目中合并两个具有重复行的 pandas 数据框(这里的行由 2 对应于 'a' 和 'b' 组成)。结果,pandas 对重复行进行笛卡尔积,如下所示:

In [8]: df1 = pd.DataFrame({'a' : [1, 2, 2], 'b' : [2, 2, 2], 'c' : [3, 6, 6]}) 

In [9]: df2 = pd.DataFrame({'a' : [2, 2], 'b' : [2, 2], 'd' : [2, 5]})          

In [10]: df1.merge(df2, how='outer', on=['a', 'b'])                             
Out[10]: 
   a  b  c    d
0  1  2  3  NaN
1  2  2  6  2.0
2  2  2  6  5.0
3  2  2  6  2.0
4  2  2  6  5.0

我想要的结果是在每个重复行之间只完成一次合并,按照它们出现的顺序(在这种情况下是按索引的数字)。所以我想要的输出是:

In [12]: df_output = pd.DataFrame({'a' : [1, 2, 2], 'b' : [2, 2, 2], 'c' : [3, 6
    ...: , 6], 'd' : [np.nan, 2, 5]})                                           

In [13]: df_output                                                              
Out[13]: 
   a  b  c    d
0  1  2  3  NaN
1  2  2  6  2.0
2  2  2  6  5.0

我该怎么做?

【问题讨论】:

  • 不会 drop_duplicates 完成这项工作吗?

标签: python pandas merge


【解决方案1】:

你需要GroupBy.cumcount创建的计数器的帮助列:

df1 = pd.DataFrame({'a' : [1, 2, 2], 'b' : [2, 2, 2], 'c' : [3, 6, 6]}) 
df2 = pd.DataFrame({'a' : [2, 2], 'b' : [2, 2], 'd' : [2, 5]})    

df1['g'] = df1.groupby(['a', 'b']).cumcount()
df2['g'] = df2.groupby(['a', 'b']).cumcount()

df = df1.merge(df2, how='outer', on=['a', 'b', 'g'])  
print (df)
   a  b  c  g    d
0  1  2  3  0  NaN
1  2  2  6  0  2.0
2  2  2  6  1  5.0

最后删除g 列:

df = df1.merge(df2, how='outer', on=['a', 'b', 'g']).drop('g', axis=1)  
print (df)
   a  b  c    d
0  1  2  3  NaN
1  2  2  6  2.0
2  2  2  6  5.0

【讨论】:

    【解决方案2】:

    drop_duplicates 不能解决你的问题吗?

    df = df1.merge(df2, how='outer', on=['a', 'b'])
    df = df.drop_duplicates()
    

    【讨论】:

      【解决方案3】:

      我觉得这样就够了

      df1.merge(df2, how = 'outer').drop_duplicates()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-17
        • 2021-01-08
        • 2017-05-28
        • 2018-12-24
        • 1970-01-01
        • 1970-01-01
        • 2018-01-08
        • 2014-10-20
        相关资源
        最近更新 更多