python - 根据单独数据框中的单词匹配创建列 - 有效但速度很慢
问题描述
我有两个数据框:
df = 字符串列表:
字符串 |
---|
文本 xxx 文本 |
文本 yyy 文本 |
文字 www 文字 |
文本eee文本 |
文本 xxx yyyy 文本 |
tag_matrix_df = 列、标签和搜索词的矩阵
列 | 搜索 | 标签 |
---|---|---|
Col1 | xxx | 标签1 |
Col1 | 年年 | 标签2 |
Col2 | 万维网 | 标签3 |
Col2 | eee | 标签3 |
Col2 | xxx yyyy | 标签4 |
当在 df 的字符串中找到搜索词时,我需要根据 tag_matrix_df 向 df 添加列,例如: df =
字 | Col1 | Col2 |
---|---|---|
文本 xxx 文本 | 标签1 | |
文本 yyy 文本 | 标签2 | |
文字 www 文字 | 标签3 | |
文本eee文本 | 标签3 | |
文本 xxx yyyy 文本 | 标签4 |
我有以下代码,它似乎工作正常,但速度很慢(tag_matrix_df > 5000 行)。
#df = Dataframe of words
#tag_matrix_df = datafreame of columns, labels and search strings
....
def assign_label(kw, matrix_df):
kw = kw.lower().strip()
for ii, tag in matrix_df.iterrows():
find_tag = tag['Find'].lower().strip()
if kw != None and find_tag in kw.split():
return tag['Label']
flag_cols = tag_matrix_df['Flag Name'].unique()
for flag in flag_cols:
filtered_matrix_df = tag_matrix_df.loc[tag_matrix_df['Flag Name'] == flag]
df[flag] = df.apply(lambda row: assign_label(row[0], filtered_matrix_df), axis=1)
另请注意 tag_matrix_df 的第一行和最后一行的问题,其中我们在“xxx yyyy”中有“xxx”。在这种情况下,它应该与 xxx yyyy 匹配,因为这是单词。
关于更智能地实现这一点的任何建议?
解决方案
使用pd.merge
:
df = pd.merge(df, tag_matrix_df, left_on='Words', right_on='Search', how='left')
df = df.pivot(index='Words', columns='Columns', values='Labels').fillna('')
>>> df
Columns Col1 Col2
Words
eee label3
www label3
xxx label1
xxx yyyy label4
yyy label2
推荐阅读
- flutter - 在颤动中设计矩形下拉小部件
- angular - 等待两个并行请求(每个都可能失败)并继续执行
- r - 在 R 中一次生成许多图
- reactjs - Apollo 应用程序中的 GraphQL 查询触发数百个重复请求
- python - 了解 Keras MNIST 连体网络并将其调整为三元组
- python - 基于词汇和正则表达式矢量化文档
- powershell-5.0 - 如何更新端口 5986 (WinRM) 证书?
- c# - EF Core 3.1 Fluent API 未检测到实体上的更改
- c# - 在 MongoDB 中为嵌套对象使用自定义序列化程序会干扰使用该对象的过滤器
- javascript - 如何在pdfMake的页眉/页脚中使用类变量/调用函数