我有两个表,或者更确切地说,熊猫Dataframes,calls
并且tags
看起来像:
calls
id | tags
--------
01 | [tag1]
02 | [tag1, tag2]
03 | []
tags
id | tag_name
-------------
01 | tag1
02 | tag2
我想要一个结果 DF,如:
matching table
id | calls_id | tag_id
----------------------
01 | 01 | 01
02 | 02 | 01
02 | 02 | 02
03 | |
所以基本上我试图在单独的 DF 中将每个调用与其各自的标签匹配
到目前为止,我最好的方法是:
def match_tags(x):
insert_df = pd.DataFrame(columns=['call_id', 'tag_id'])
for y in x['tags']:
insert_df = insert_df.append({'call_id':x.id, 'tag_id': tags_df['id'].loc[y]}, ignore_index=True)
insert_df.head()
return insert_df
calls_df.apply(lambda x: pd.concat([tag_matching_df, match_tags(x)]), axis=1)
我不确定这里的 lambda 函数是否是正确的解决方案。
您可以结合使用爆炸和合并。Explode 为嵌入列表中的每个项目创建一行。
import pandas as pd
calls = pd.DataFrame([
[1 , ["tag1"]],
[2 , ["tag1", "tag2"]],
[3 , []]
], columns=["callid","tag"])
tags = pd.DataFrame([
[1 , "tag1"],
[2 , "tag2"]
], columns=["tagid","tag"])
pd.merge(calls.explode("tag"),tags, on="tag").drop(columns=["tag"])
给予
callid tagid
0 1 1
1 2 1
2 2 2
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句