如何根据特定条件用另一个数据框中的值替换数据框中的值?
我要替换的列“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 DataFrameSee 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
这里:
# 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):
谢谢。我尝试了你的解决方案,但得到这个错误:“KeyError:'没有[0 1 \ n1 1 \ n2 2 \ nName:qid1,dtype:object]在[index]'” –
为什么映射?就像我在我的回答中写的那样,'loc'就可以做到。唯一的问题是,我忘了在'df'上设置索引...哎呀! :-P – Kartik
'map'是映射数据的更好,更明显的方式。 – jezrael
比'.loc'慢。我们来做一次时间测试吧? – Kartik