繁体   English   中英

熊猫在第一列合并

[英]Pandas merge on first column

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

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

我该怎么做?

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

drop_duplicates不能解决您的问题吗?

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

我认为就足够了

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM