熊猫中的多索引合并,联接或串联

时间:2019-08-05 15:11:55

标签: python pandas dataframe join merge

我对official documentation中的示例不了解。是否有一些教科书或可以对这些概念有扎实理解的东西?

对于我的直接用例,我具有以下格式的数据,其中:

- purple is the multi-index

- integers are for illustration only

- green is due to df1

- yellow is due to df2

- red is Nan

- blue is the part of index that is common to both dataframes (there is never conflicting data)

df1:

df1

df2:

df2

我想要以下内容:

合并:

merged

我尝试过:

df1.merge(df2, how='outer')

但是它摆脱了通用的多索引,并且似乎也创建了重复的行,(这样很难找到数据,所以我可能会误会,但是它肯定错过了合并某些通用索引的作用)

不是我想要的: Not what I want:

1 个答案:

答案 0 :(得分:0)

重现问题:

DF1

import pandas as pd
c1 = ['A', 'B', 'C', 'D', 'E', 'F']
d1 = [
    ['A01', 'B01', 'C01', 'D01', 'E01', 'F01'],
    ['A02', 'B02', 'C02', 'D02', 'E02', 'F02'],
    ['A03', 'B03', 'C03', 'D03', 'E03', 'F03'],
    ['A04', 'B04', 'C04', 'D04', 'E04', 'F04'],
    ['A05', 'B05', 'C05', 'D05', 'E05', 'F05'],
    ['A14', 'B14', 'C14', 'D14', 'E14', 'F14'],
    ['A15', 'B15', 'C15', 'D15', 'E15', 'F15'],
    ['A16', 'B16', 'C16', 'D16', 'E16', 'F16'],
    ['A17', 'B17', 'C17', 'D17', 'E17', 'F17'],
    ['A26', 'B26', 'C26', 'D26', 'E26', 'F26'],
    ['A27', 'B27', 'C27', 'D27', 'E27', 'F27'],
    ['A28', 'B28', 'C28', 'D28', 'E28', 'F28'],
    ['A29', 'B29', 'C29', 'D29', 'E29', 'F29']
]
df1 = pd.DataFrame(columns=c1, data=d1).set_index(['A','B'])
df1

DF2

import pandas as pd
c2 = ['A', 'B', 'Z']
d2 = [
    ['A01', 'B01', 'Z01'],
    ['A02', 'B02', 'Z02'],
    ['A03', 'B03', 'Z03'],
    ['A04', 'B04', 'Z04'],
    ['A05', 'B05', 'Z05'],
    ['A06', 'B06', 'Z06'],
    ['A07', 'B07', 'Z07'],
    ['A08', 'B08', 'Z08'],
    ['A09', 'B09', 'Z09'],
    ['A10', 'B10', 'Z10'],
    ['A11', 'B11', 'Z11'],
    ['A12', 'B12', 'Z12'],
    ['A13', 'B13', 'Z13'],
    ['A14', 'B14', 'Z14'],
    ['A15', 'B15', 'Z15'],
    ['A16', 'B16', 'Z16'],
    ['A17', 'B17', 'Z17'],
    ['A18', 'B18', 'Z18'],
    ['A19', 'B19', 'Z19'],
    ['A20', 'B20', 'Z20'],
    ['A21', 'B21', 'Z21'],
    ['A22', 'B22', 'Z22'],
    ['A23', 'B23', 'Z23'],
    ['A24', 'B24', 'Z24'],
    ['A25', 'B25', 'Z25'],
    ['A26', 'B26', 'Z26'],
    ['A27', 'B27', 'Z37'],
    ['A28', 'B28', 'Z28'],
    ['A29', 'B29', 'Z29'],
    ['A30', 'B30', 'Z30']
]
df2 = pd.DataFrame(columns=c2, data=d2).set_index(['A','B'])
df2

答案:DF1和DF2合并

import pandas as pd
df1.reset_index().merge(df2.reset_index(), how='outer').set_index(['A','B']).sort_values('A')

最初的问题可能是没有考虑多索引的列。

答案正确地产生:

        C   D   E   F   Z
A   B                   
A01 B01 C01 D01 E01 F01 Z01
A02 B02 C02 D02 E02 F02 Z02
A03 B03 C03 D03 E03 F03 Z03
A04 B04 C04 D04 E04 F04 Z04
A05 B05 C05 D05 E05 F05 Z05
A06 B06 NaN NaN NaN NaN Z06
A07 B07 NaN NaN NaN NaN Z07
A08 B08 NaN NaN NaN NaN Z08
A09 B09 NaN NaN NaN NaN Z09
A10 B10 NaN NaN NaN NaN Z10
A11 B11 NaN NaN NaN NaN Z11
A12 B12 NaN NaN NaN NaN Z12
A13 B13 NaN NaN NaN NaN Z13
A14 B14 C14 D14 E14 F14 Z14
A15 B15 C15 D15 E15 F15 Z15
A16 B16 C16 D16 E16 F16 Z16
A17 B17 C17 D17 E17 F17 Z17
A18 B18 NaN NaN NaN NaN Z18
A19 B19 NaN NaN NaN NaN Z19
A20 B20 NaN NaN NaN NaN Z20
A21 B21 NaN NaN NaN NaN Z21
A22 B22 NaN NaN NaN NaN Z22
A23 B23 NaN NaN NaN NaN Z23
A24 B24 NaN NaN NaN NaN Z24
A25 B25 NaN NaN NaN NaN Z25
A26 B26 C26 D26 E26 F26 Z26
A27 B27 C27 D27 E27 F27 Z37
A28 B28 C28 D28 E28 F28 Z28
A29 B29 C29 D29 E29 F29 Z29
A30 B30 NaN NaN NaN NaN Z30