我必须处理数据帧,并且需要将两者结合起来以得到一个新的数据帧,其中第一个(df1
)中的某些元素将插入第二个(df2
)中。
例如:
df1=
event_id entity_type start_i end_i token_name doc_id
0 T1 Drug 10756 10766 amiodarone 114220
1 T2 Drug 14597 14614 Calcium Carbonate 114220
2 T3 Strength 14615 14621 500 mg 114220
3 T4 Form 14622 14638 Tablet 114220
和第二个数据帧:
df2 =
event_id relation_type arg_1 arg_2 doc_id
235 R1 Strength-Drug T3 T2 114220
236 R2 Form-Drug T4 T2 114220
我需要获取合并的数据帧:
df3 =
event_id relation_type arg_1 arg_2 doc_id
235 R1 Strength-Drug 500 mg Calcium Carbonate 114220
236 R2 Form-Drug Tablet Calcium Carbonate 114220
基本上,这里发生的是根据以下情况将{{1}指定的arg_1
中的arg_2
和df2
替换为{{1} Ti
中的Tj
和token_name
中的event_id
。
Ti
我有一个“快速且脏”的实现,可以很好地运行,但是非常慢,并且由于文档数量很多,所以这是不可行的。
关于正确实施Pandas的任何想法?这应该是pd.join / pd.merge的棘手组合,但我仍在努力找出哪一个。谢谢。
答案 0 :(得分:2)
将map
与dictionary
创建的zip
一起使用:
d = dict(zip(df1['event_id'], df1['token_name']))
#alternative
#d = df1.set_index('event_id')['token_name']
cols = ['arg_1','arg_2']
#not exist values are set to NaN
df2[cols] = df2[cols].apply(lambda x: x.map(d))
#alternative - not exist values are not changed
#df2[cols] = df2[cols].replace(d)
print (df2)
event_id relation_type arg_1 arg_2 doc_id
235 R1 Strength-Drug 500 mg Calcium Carbonate 114220
236 R2 Form-Drug Tablet Calcium Carbonate 114220