熊猫在第一列合并

时间:2019-03-11 06:58:50

标签: python pandas merge

我正在尝试合并的条目中,合并两个具有重复行(此处的行由2组成的行,分别对应于“ a”和“ b”)的两个熊猫数据框。结果,熊猫将重复行的笛卡尔积乘以如下所示:

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

我该怎么做?

3 个答案:

答案 0 :(得分:0)

您需要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

答案 1 :(得分:0)

<a>不能解决您的问题吗?

drop_duplicates

答案 2 :(得分:0)

我认为就足够了

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