Pandas:查找单独数据框中列出的全名和/或首字母缩略词是否存在于数据框的列中,并添加首字母缩略词列

Pandas: Find if the full name, acronym, or both listed in a separate data frame is present in a column in a data frame and add a column of acronyms

提问人:mamoset 提问时间:10/30/2023 更新时间:10/30/2023 访问量:34

问:

我有一个熊猫数据框架,其中包括评估名称的全名和首字母缩写词,称为names_df。在此处输入图像描述

我还有另一个数据框,其中包含如何使用这些评估的信息,称为uses_df。在此处输入图像描述

我想检查name_df中的全名或首字母缩略词或两者兼而有之)是否出现在uses_df中,并在uses_df中添加一个新列,其中包括在缩略词的“使用”列文本中出现的评估列表,即使文本中只出现“全名”,或者“全名”和“首字母缩略词”都出现在文本中。此外,当相同的评估名称/首字母缩略词在文本中多次出现时,它只返回一次。在此处输入图像描述

我使用“str.contains”等尝试了几种不同的东西,但无法使其工作。实际数据可能比上面的示例大得多。

Python Pandas 数据帧 列表 包含

评论

1赞 hd1 10/30/2023
将代码粘贴为“编辑”,并附上数据的示例查询以及查询的结果。

答:

0赞 Corralien 10/30/2023 #1

您可以使用正则表达式来提取两者,并且:Assessment_Nameacronym

import re

# Build the regex pattern
names = '|'.join(re.escape(name) for name in names_df['Assessment_Name'])
acronyms = names_df['acronym'].str.cat(sep='|')
pattern = fr"\b({acronyms}|{names})\b"

# Transform Assessment_Name to acronym
dmap = names_df.set_index('Assessment_Name')['acronym']

# Extract strings then apply above transformation
# and finally get unique acronyms for each row
out = (uses_df['uses'].str.extractall(pattern).replace(dmap)
          .reset_index(level=0).set_axis(['index', 'acronym'], axis=1)
          .drop_duplicates().groupby('index').agg(list))

uses_df['assessment_appeared'] = out

输出:

>>> uses_df
                                    uses assessment_appeared
0                  AN1 and AN7 were used          [AN1, AN7]
1        Assessment Name 2 (AN2) is used               [AN2]
2  Assessment Name 6 were useful for xyz               [AN6]

>>> pattern
\b(AN1|AN2|AN3|AN4|AN5|AN6|AN7|Assessment\ Name\ 1|Assessment\ Name\ 2|Assessment\ Name\ 3|Assessment\ Name\ 4|Assessment\ Name\ 5|Assessment\ Name\ 6|Assessment\ Name\ 7)\b

评论

0赞 mamoset 11/1/2023
谢谢!我希望我能像这样编码 - 尤其是你如何使用正则表达式(有一天!当我在实际数据集中尝试这样做时,我得到代码的“out =”部分的“ValueError:长度不匹配:预期轴有 4 个元素,新值有 2 个元素”。知道为什么吗?
0赞 Corralien 11/1/2023
哪一行导致了此错误?