首页 > 解决方案 > Pandas 中的多索引合并、连接或连接

问题描述

我不理解官方文档中的示例。是否有一些教科书或可以对这些概念有深入理解的东西?

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

- 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

我想要以下内容:

合并:

合并

我试过了:

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

但它摆脱了常见的多索引,并且似乎也创建了重复的行,就像这样(发现很难跟踪数据,所以我可能会弄错,但它肯定错过了合并一些常见的索引)

不是我想要的: 不是我想要的:

标签: pythonpandasdataframejoinmerge

解决方案


重现问题:

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

推荐阅读