我正在尝试合并的条目中,合并两个具有重复行(此处的行由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
我该怎么做?
答案 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()