更新来自另一个数据帧的值的数据帧

时间:2017-07-25 09:13:53

标签: python pandas dataframe

我想更新数据框X来自Y的数据框。

X = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
                  'B': ['B0', 'B1', 'B2'], 
                  'C': ['C0', 'C1', 'C2'], 
                  'D': ['D0', 'D1', 'D2']})

    A   B   C   D
0  A0  B0  C0  D0
1  A1  B1  C1  D1
2  A2  B2  C2  D2

Y = pd.DataFrame({'A': ['A0', 'A1'],
                  'B': ['B0', 'B1'], 
                  'C': ['C0xx', 'C1xx'], 
                  'D': ['D0xx', 'D1xx']})

    A   B     C     D
0  A0  B0  C0xx  D0xx
1  A1  B1  C1xx  D1xx

结果是:

    A   B   C   D
0  A0  B0  C0xx  D0xx
1  A1  B1  C1xx  D1xx
2  A2  B2  C2    D2

当然我的数据框架比较大。

2 个答案:

答案 0 :(得分:3)

1。两个DataFrame都具有相同的索引

您在问题中给出的示例中提供了这种情况。 您可能想要使用update方法:

>>> X.update(Y)
>>> X

    A   B     C     D
0  A0  B0  C0xx  D0xx
1  A1  B1  C1xx  D1xx
2  A2  B2    C2    D2

如果行在X和Y中的顺序不同,它也有效:

>>> Y = pd.DataFrame({'A': ['A1', 'A0'], 
                      'B': ['B1', 'B0'], 
                      'C': ['C1xx', 'C0xx'], 
                      'D': ['D1xx', 'D0xx']}, 
                     index=[1,0])
>>> Y
    A   B     C     D
1  A1  B1  C1xx  D1xx
0  A0  B0  C0xx  D0xx

>>> X.update(Y)
>>> X
    A   B     C     D
0  A0  B0  C0xx  D0xx
1  A1  B1  C1xx  D1xx
2  A2  B2    C2    D2

2。不同的索引

如果Y有不同的索引:

>>> Y = pd.DataFrame({'A': ['A0', 'A1'], 
                      'B': ['B0', 'B1'], 
                      'C': ['C0xx', 'C1xx'], 
                      'D': ['D0xx', 'D1xx']}, 
                     index=[2,1])
>>> Y

    A   B     C     D
2  A0  B0  C0xx  D0xx
1  A1  B1  C1xx  D1xx

如果您可以找到另一个可用作索引的列(标识行以使它们与要替换的行匹配),您仍然可以使用update。我以“A”列为例,但多重索引也可以。

>>> X2, Y2 = X.set_index("A"), Y.set_index("A")
>>> X2.update(Y2)
>>> X2.reset_index(inplace=True)
>>> X2
    A   B     C     D
0  A0  B0  C0xx  D0xx
1  A1  B1  C1xx  D1xx
2  A2  B2    C2    D2

答案 1 :(得分:1)

我认为如果需要A, B列中的df列添加缺失值,则combine_first需要set_index

print (Y.set_index(['A','B']).combine_first(X.set_index(['A','B'])).reset_index())

    A   B     C     D
0  A0  B0  C0xx  D0xx
1  A1  B1  C1xx  D1xx
2  A2  B2    C2    D2

不幸的是update工作不好:

Y = pd.DataFrame({'A': ['A0', 'A1'],
                  'B': ['B0', 'B1'], 
                  'C': ['C0xx', 'C1xx'], 
                  'D': ['D0xx', 'D1xx']}, index=[2,1])
print (X)
    A   B   C   D
0  A0  B0  C0  D0
1  A1  B1  C1  D1
2  A2  B2  C2  D2

print (Y)
    A   B     C     D
2  A0  B0  C0xx  D0xx
1  A1  B1  C1xx  D1xx

X.update(Y)
print (X)
    A   B     C     D
0  A0  B0    C0    D0
1  A1  B1  C1xx  D1xx
2  A0  B0  C0xx  D0xx
X.set_index(['A','B']).update(Y.set_index(['A','B']))
print (X)
    A   B   C   D
0  A0  B0  C0  D0
1  A1  B1  C1  D1
2  A2  B2  C2  D2
print (Y.set_index(['A','B']).combine_first(X.set_index(['A','B'])).reset_index())
    A   B     C     D
0  A0  B0  C0xx  D0xx
1  A1  B1  C1xx  D1xx
2  A2  B2    C2    D2