2017-07-27 126 views
1

我要替換的列「q1_body」和數據幀「結果」,「q2_body」具有相同ID的「身體」的值數據框「DF」的值,代碼如下:如何根據特定條件用另一個數據框中的值替換數據框中的值?

def replace_body(x): 
    id1 = result.loc[x].qid1 
    result.loc[x].q1_body = df[df["qid"]==id1]["body"] 
    id2 = result.loc[x].qid2 
    result.loc[x].q2_body = df[df["qid"]==id2]["body"] 

result.index.map(lambda x: replace_body(x)) 

當我運行代碼,我在我的IPython的控制檯下面的提醒,並在這裏正好卡程序:

//anaconda/lib/python3.6/site-packages/pandas/core/generic.py:3110:
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
self[name] = value

希望誰能告訴我什麼是錯在這裏。

假設兩個數據幀是:

結果:

qid1 q1_body qid2 q2_body 
1a abc 2a bcd 
1a abc 3a cde 
2a bcd 3a cde 

DF:

qid body 
1a sfgaks 
2a shdfjk 
3a adjkwf 

和預期的輸出是這樣的:

結果:

qid1 q1_body qid2 q2_body 
1a sfgaks 2a shdfjk 
1a sfgaks 3a adjkwf 
2a shdfjk 3a adjkwf 

回答

2

您需要通過創建Seriesmap通過set_index

s = df.set_index('qid')['body'] 
result['q1_body'] = result['qid1'].map(s) 
result['q2_body'] = result['qid2'].map(s) 
print (result) 
    qid1 q1_body qid2 q2_body 
0 1a sfgaks 2a shdfjk 
1 1a sfgaks 3a adjkwf 
2 2a shdfjk 3a adjkwf 
+0

爲什麼映射?就像我在我的回答中寫的那樣,'loc'就可以做到。唯一的問題是,我忘了在'df'上設置索引...哎呀! :-P – Kartik

+0

'map'是映射數據的更好,更明顯的方式。 – jezrael

+0

比'.loc'慢。我們來做一次時間測試吧? – Kartik

1

這裏:

# Set index and get body as a series 
s = df.set_index(qid)['body'] 
result['q1_body'] = s.loc[result['qid1']].values 
result['q2_body'] = s.loc[result['qid2']].values 

結果:

qid1 q1_body qid2 q2_body 
0 1a sfgaks 2a shdfjk 
1 1a sfgaks 3a adjkwf 
2 2a shdfjk 3a adjkwf 

時序(10K行,並使用自動生成的Lorem):

我的方法 My method

@ Jezareal的見面HOD @Jezreal's Method

+0

謝謝。我嘗試了你的解決方案,但得到這個錯誤:「KeyError:'沒有[0 1 \ n1 1 \ n2 2 \ nName:qid1,dtype:object]在[index]'」 –

相關問題