熊猫用重复索引连接列

时间:2018-11-19 14:07:58

标签: python pandas

我有两个要水平连接的数据框,将它们按列的值分组。他们从pandas.pydata website开始:

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我可以避免按索引合并,但是我可以指定一个列,这样会更好

2 个答案:

答案 0 :(得分:2)

使用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

答案 1 :(得分:1)

另一种可能的解决方案是使用join

df1.join(df4,how='inner', lsuffix='_df1', rsuffix='_df4')

输出:

    A B_df1   C D_df1 B_df4 D_df4   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