2017-03-21 100 views
1

我有一個包含許多列的大型DataFrame。我也有一個較小的DataFrame和兩列 - 稱它們爲'label'和'value',它們都在較大的DataFrame中。我想用較小的DataFrame的'value'列來替換較大的DataFrame的'value'列,對於'label'與較小的DataFrame中的一行相匹配的較大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'] 

答案顯然不起作用,因爲它的NaN不在小DF的標籤。使用.map()也有類似的問題。

我使用的for循環看起來非常unpythonic,unpandas和緩慢。我錯過了什麼更好的做法呢?

回答

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