首页 > 解决方案 > 熊猫连接具有重复索引的列

问题描述

我有两个要水平连接的数据框,按列的值对它们进行分组。他们从pandas.pydata 网站

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                    'B': ['B0', 'B1', 'B2', 'B3'],
                    'C': ['C0', 'C1', 'C2', 'C3'],
                    'D': ['D0', 'D1', 'D2', 'D3']},
                   index=[0, 1, 2, 3])
df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
                    'D': ['D2', 'D3', 'D6', 'D7'],
                    'F': ['F2', 'F3', 'F6', 'F7']},
                   index=[2, 3, 6, 7])

df1 = 
    A   B   C   D
0  A0  B0  C0  D0
1  A1  B1  C1  D1
2  A2  B2  C2  D2
3  A3  B3  C3  D3

df4 = 
    B   D   F
2  B2  D2  F2
3  B3  D3  F3
6  B6  D6  F6
7  B7  D7  F7

result = pd.concat([df1, df4], axis=1, join='inner')

result = 
    A   B   C   D   B   D   F
2  A2  B2  C2  D2  B2  D2  F2
3  A3  B3  C3  D3  B3  D3  F3

这行得通,我很高兴。所以我使用这个技巧通过某个列的值合并 2 个数据帧,基本上我用该列重新索引数据帧,然后我进行连接。但是该列中的值是重复的,因此我以具有重复索引的数据框结尾:

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                    'B': ['B0', 'B1', 'B2', 'B3'],
                    'C': ['C0', 'C1', 'C2', 'C3'],
                    'D': ['D0', 'D1', 'D2', 'D3']},
                   index=[0, 3, 3, 2])
df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
                    'D': ['D2', 'D3', 'D6', 'D7'],
                    'F': ['F2', 'F3', 'F6', 'F7']},
                   index=[2, 3, 6, 7])
df1 = 
    A   B   C   D
0  A0  B0  C0  D0
3  A1  B1  C1  D1
3  A2  B2  C2  D2
2  A3  B3  C3  D3

df4 = 
    B   D   F
2  B2  D2  F2
3  B3  D3  F3
6  B6  D6  F6
7  B7  D7  F7

所以我希望这两个数据框能够加入,所以我最终会得到:

result = 
    A   B   C   D   B   D   F
3  A1  B1  C1  D1  B2  D2  F2
3  A2  B2  C2  D2  B2  D2  F2
2  A3  B3  C3  D3  B3  D3  F3

(请注意,df1 中索引为 3 的两行都与 df4 中索引为 3 的行连接)但是这不起作用。

ValueError: Shape of passed values is (7, 5), indices imply (7, 3)

我怎样才能做到这一点?f 我可以避免按索引合并,但我可以指定一个列,这样会更好

标签: pythonpandas

解决方案


merge按索引匹配的一种可能解决方案,默认how='inner'应省略:

result = pd.merge(df1, df4, left_index=True, right_index=True)
print (result)
    A B_x   C D_x B_y D_y   F
2  A3  B3  C3  D3  B2  D2  F2
3  A1  B1  C1  D1  B3  D3  F3
3  A2  B2  C2  D2  B3  D3  F3

它创建重复匹配行的组合:

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                    'B': ['B0', 'B1', 'B2', 'B3'],
                    'C': ['C0', 'C1', 'C2', 'C3'],
                    'D': ['D0', 'D1', 'D2', 'D3']},
                   index=[0, 3, 3, 3])
df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
                    'D': ['D2', 'D3', 'D6', 'D7'],
                    'F': ['F2', 'F3', 'F6', 'F7']},
                   index=[2, 3, 3, 7])
print (df1)
    A   B   C   D
0  A0  B0  C0  D0
3  A1  B1  C1  D1
3  A2  B2  C2  D2
3  A3  B3  C3  D3

print (df4)
    B   D   F
2  B2  D2  F2
3  B3  D3  F3
3  B6  D6  F6
7  B7  D7  F7

result = pd.merge(df1, df4, left_index=True, right_index=True)
print (result)
    A B_x   C D_x B_y D_y   F
3  A1  B1  C1  D1  B3  D3  F3
3  A1  B1  C1  D1  B6  D6  F6
3  A2  B2  C2  D2  B3  D3  F3
3  A2  B2  C2  D2  B6  D6  F6
3  A3  B3  C3  D3  B3  D3  F3
3  A3  B3  C3  D3  B6  D6  F6

推荐阅读