pandas 合并 df 多对多且不重复

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)

jez*_*ael 5

然后使用.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)