提问人:mamoset 提问时间:10/30/2023 更新时间:10/30/2023 访问量:34
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
问:
我有一个熊猫数据框架,其中包括评估名称的全名和首字母缩写词,称为names_df。在此处输入图像描述
我还有另一个数据框,其中包含如何使用这些评估的信息,称为uses_df。在此处输入图像描述
我想检查name_df中的全名或首字母缩略词或两者兼而有之)是否出现在uses_df中,并在uses_df中添加一个新列,其中包括在缩略词的“使用”列文本中出现的评估列表,即使文本中只出现“全名”,或者“全名”和“首字母缩略词”都出现在文本中。此外,当相同的评估名称/首字母缩略词在文本中多次出现时,它只返回一次。在此处输入图像描述
我使用“str.contains”等尝试了几种不同的东西,但无法使其工作。实际数据可能比上面的示例大得多。
答:
0赞
Corralien
10/30/2023
#1
您可以使用正则表达式来提取两者,并且:Assessment_Name
acronym
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
哪一行导致了此错误?
评论