使用部分地图更新pandas DataFrame的列

时间:2017-03-21 09:06:32

标签: python pandas dictionary dataframe indexing

我有一个包含许多列的大型DataFrame。我还有一个较小的DataFrame,有两列 - 称为'label'和'value',两者都在较大的DataFrame中。我想将较大DataFrame的'value'列替换为较小DataFrame的'value'列,对于较大DataFrame的行,其中'label'与较小DataFrame中的行匹配。

for循环的逻辑是:

largeDF = pd.DataFrame([['a',1],['b',2],['c',3],['d',4],['e',5]], columns=['label','value']).set_index('label')
smallDF = pd.DataFrame([['d',6],['e',7]], columns=['label','value']).set_index('label')
for label in smallDF.index:
    largeDF.loc[label,'value'] = smallDF.loc[label,'value']

不幸的是

的明显答案
largeDF['value'] = smallDF['value']

不起作用,因为它NaNs不在小DF中的标签。使用.map()也有类似的问题。

我正在使用的for循环似乎非常单调,不可取和慢。这样做的最好方法是什么,我错过了?

1 个答案:

答案 0 :(得分:3)

您可以使用combine_first

print (smallDF['value'].combine_first(largeDF['value']))
label
a    1.0
b    2.0
c    3.0
d    6.0
e    7.0
Name: value, dtype: float64

所有在一起:

largeDF = pd.DataFrame([['a',1],['b',2],['c',3],['d',4],['e',5]], columns=['label','value'])
            .set_index('label')
largeDF['a'] = 1
largeDF['b'] = 'f'
smallDF = pd.DataFrame([['d',6],['e',7]], columns=['label','value']).set_index('label')
print (largeDF)
       value  a  b
label             
a          1  1  f
b          2  1  f
c          3  1  f
d          4  1  f
e          5  1  f

print (smallDF)
       value
label       
d          6
e          7

largeDF['value'] = smallDF['value'].combine_first(largeDF['value']).astype(int)
print (largeDF)
       value  a  b
label             
a          1  1  f
b          2  1  f
c          3  1  f
d          6  1  f
e          7  1  f