首页 > 解决方案 > Pandas 如何在不影响其他列的情况下替换某些列中的所有行?

问题描述

我有一个带有 abcde 列的主数据框(df_a)。我有第二个数据框(df_b),其中包含更新 abc 列中的值的新信息。

最小的可重现代码:

df_a = pd.DataFrame(data={
    'a': [1, 0, 0, 0, 0, 0],
    'b': [2, 0, 0, 0, 0, 0], 
    'c': [3, 0, 0, 0, 0, 0],
    'd': ['foo', 'foo', 'foo', 'foo', 'foo', 'foo'],
    'e': ['bar','bar','bar','bar','bar','bar']
})

df_b = pd.DataFrame(data={
    'a': [1, 0, 2, 0, 0, 0],
    'b': [2, 0, 2, 0, 0, 0], 
    'c': [3, 0, 2, 0, 0, 0]
})

df_a:
    a   b   c   d   e
0   1   2   3   foo bar
1   0   0   0   foo bar
2   0   0   0   foo bar
3   0   0   0   foo bar
4   0   0   0   foo bar
5   0   0   0   foo bar

df_b:
    a   b   c
0   1   2   3
1   0   0   0
2   2   2   2
3   0   0   0
4   0   0   0
5   0   0   0

Desired output: 
df_a_new:
    a   b   c   d   e
0   1   2   3   foo bar
1   0   0   0   foo bar
2   2   2   2   foo bar
3   0   0   0   foo bar
4   0   0   0   foo bar
5   0   0   0   foo bar

索引总是相同的,所以我通常只对单列使用 map(),但在我的实际数据集中,我必须更新 50 列,而且效率不高。

标签: pythonpandas

解决方案


通用解决方案如下所示:

要么找到列的差异,df_a然后df_b将它们分配给df_b

df_b.assign(**df_a.loc[:,df_a.columns.difference(df_b.columns,sort=False)])

或者另一种方式:

df_b.combine_first(df_a)

推荐阅读