熊猫数据框边距按参数

时间:2019-02-10 14:09:06

标签: python pandas

我必须处理数据帧,并且需要将两者结合起来以得到一个新的数据帧,其中第一个(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_2df2替换为{{1} Ti中的Tjtoken_name中的event_id

Ti

我有一个“快速且脏”的实现,可以很好地运行,但是非常慢,并且由于文档数量很多,所以这是不可行的。

关于正确实施Pandas的任何想法?这应该是pd.join / pd.merge的棘手组合,但我仍在努力找出哪一个。谢谢。

1 个答案:

答案 0 :(得分:2)

mapdictionary创建的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