2017-03-21 4 views
1

多くの列を持つ大きなDataFrameがあります。私はまた、2つの列を持つ小さなDataFrameを持っています - それらを 'Label'と 'Value'と呼んでください。どちらも大きなDataFrameにあります。大きいDataFrameの「value」列を、小さなDataFrameの「value」列で置き換えます。大規模なDataFrameの行では、「label」が小さいDataFrameの行と一致します。 forループの面で部分地図を使用してpandas DataFrameの列を更新します

ロジックがある:それは小さなDFにないラベルをNaNのため

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'] 

の明白な答えは動作しません。 .map()も同様の問題があります。

私が使用しているforループは、非常にunpythonic、unpandas、slowのようです。私が行方不明になっているこのより良い方法は何ですか?

答えて

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 
関連する問題