2017-07-27 123 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]'” –

相关问题