2017-03-21 2 views
1

많은 열이있는 대형 DataFrame이 있습니다. 또한 두 개의 열이있는 더 작은 DataFrame이 있습니다. 두 개의 DataFrame에있는 '레이블'과 '값'을 호출합니다. 큰 DataFrame의 'value'열을 작은 DataFrame의 'value'열로 바꿉니다. 큰 DataFrame 행의 경우 'label'이 작은 DataFrame의 행과 일치합니다. for 루프의 측면에서부분지도를 사용하여 pandas DataFrame의 열을 업데이트하십시오.

논리는 : 그것은 작은 DF에없는 레이블을 낭 때문에

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 및 느린 것 같습니다. 내가 누락 된 이것을하는 더 좋은 방법은 무엇입니까?

답변

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 
관련 문제