Zar*_*chi 2 python dataframe pandas
假设我有两个如下所示的 df,在列“a”和“b”上具有相同的键值:
df1
a b c
0 0 3 6
1 0 3 7
2 1 4 8
3 2 5 9
Run Code Online (Sandbox Code Playgroud)
df2
a b d
0 0 3 10
1 0 3 10
2 1 4 12
3 2 5 13
Run Code Online (Sandbox Code Playgroud)
如何合并它们而不重复?
合并 df 然后删除重复项的选项并不令人满意
我尝试使用下面的代码来做到这一点,但这会创建重复的行并显着增加文件容量。
df = pd.merge(df1, df2, on=['a', 'b'], how='left', validate='many_to_many')
df = pd.merge(df1, df2, on=['a', 'b'], how='inner')
Run Code Online (Sandbox Code Playgroud)
预期结果:
a b c d
0 0 3 6 10
1 0 3 7 10
2 1 4 8 12
3 2 5 9 13
Run Code Online (Sandbox Code Playgroud)
然后使用.groupby().cumcount()在两个 DataFrame 中创建计数器列merge:
df1['g'] = df1.groupby(['a', 'b']).cumcount()
df2['g'] = df2.groupby(['a', 'b']).cumcount()
df = pd.merge(df1, df2, on=['a', 'b', 'g'], how='inner')
print(df)
a b c g d
0 0 3 6 0 10
1 0 3 7 1 10
2 1 4 8 0 12
3 2 5 9 0 13
Run Code Online (Sandbox Code Playgroud)
10通过将第二个 df: secondary中的数据更改为 ,可以最好地看出与其他解决方案的差异11。我的解决方案正确地将第一个重复对a, bfromdf1与第一a, b对 from合并df2,对于所有重复项以及唯一对来说都是类似的:
data_dic = {
"a": [0, 0, 1, 2],
"b": [3, 3, 4, 5],
"d": [10, 11, 12, 13]
}
df2 = pd.DataFrame(data_dic)
df1['g'] = df1.groupby(['a', 'b']).cumcount()
df2['g'] = df2.groupby(['a', 'b']).cumcount()
df = pd.merge(df1, df2, on=['a', 'b', 'g'], how='inner')
print(df)
a b c g d
0 0 3 6 0 10
1 0 3 7 1 11
2 1 4 8 0 12
3 2 5 9 0 13
Run Code Online (Sandbox Code Playgroud)