合并列和行

时间:2018-07-24 13:21:13

标签: python pandas dataframe join merge

我正在尝试使用python制作大型数据框。我有很多带有不同行和列名称的小数据框,但是行名称和列名称之间有些重叠。我试图做的是从一个小的数据帧开始,然后一个接一个地添加其他数据帧。

每种特定的行-列组合都是唯一的,最后可能会有很多NA。

我曾尝试使用pandas的合并来做到这一点,但这会导致数据框比我需要的大得多,因为行和列的名称是重复的而不是合并的。如果我能找到让熊猫意识到NaN不是值并在添加新的小数据帧时覆盖它的方法,我想我会得到想要的结果。 我也愿意尝试一些不使用熊猫的东西。

For example:
DF1         A    B
        Y   1    2
        Z   0    1


DF2         C    D
        X   1    2
        Z   0    1

Merged:     A    B    C    D
        Y   1    2    NA   NA
        Z   0    1    0    1
        X  NA    NA   1    2

And then a new dataframe has to be added:
DF3         C    E
        Y   0    1
        W   1    1

The result should be:
            A    B    C    D    E
        Y   1    2    0    NA   1
        Z   0    1    0    1    NA
        X   NA   NA   1    2    NA
        W   NA   NA   1    NA   1

But what happens is:
            A    B    C_x    C_y    D    E
        Y   1    2    NA     1      NA   1
        Z   0    1    0      0      1    NA
        X   NA   NA   1      1      2    NA
        W   NA   NA   1      1      NA   1

1 个答案:

答案 0 :(得分:1)

您要使用DataFrame.combine_first,它将根据索引对齐DataFrame,并在左侧DataFrame中对值进行优先级排序,同时在右侧DataFrame中使用值来填充缺失值。

df1.combine_first(df2).combine_first(df3)

样本数据

import pandas as pd
df1 = pd.DataFrame({'A': [1,0], 'B': [2,1]})
df1.index=['Y', 'Z']

df2 = pd.DataFrame({'C': [1,0], 'D': [2,1]})
df2.index=['X', 'Z']

df3 = pd.DataFrame({'C': [0,1], 'E': [1,1]})
df3.index=['Y', 'W']

代码

df1.combine_first(df2).combine_first(df3)

输出:

     A    B    C    D    E
W  NaN  NaN  1.0  NaN  1.0
X  NaN  NaN  1.0  2.0  NaN
Y  1.0  2.0  0.0  NaN  1.0
Z  0.0  1.0  0.0  1.0  NaN