我有一个包含许多列的大型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循环似乎非常单调,不可取和慢。这样做的最好方法是什么,我错过了?
答案 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