【问题标题】:How to search a list of strings in a data frame column and return the matching string as an adjacent column如何在数据框列中搜索字符串列表并将匹配的字符串作为相邻列返回
【发布时间】:2022-12-15 05:49:21
【问题描述】:

我有的。 我有一列“学生”,其中包含学生姓名和他们的个性。 我有一个名为“质量”的列表,其中包含过滤目的所需的质量。 我想要的是。 我想要“学生”旁边的一列,它从列表中返回匹配的字符串。

#我有的

import pandas as pd

Personality = {'Student':["Aysha is clever", "Ben is stronger", "Cathy is clever and strong", "Dany is intelligent", "Ella is naughty", "Fred is quieter"]}
index_labels=['1','2','3','4','5','6']
df = pd.DataFrame(Personality,index=index_labels)

qualities = ['calm', 'clever', 'quiet', 'bold', 'strong', 'cute']

#我想要的是

Output

【问题讨论】:

  • 为什么不增加一个包含匹配词列表的列呢?为每个匹配添加任意列似乎不合理。

标签: python pandas


【解决方案1】:

您可以使用 str.extractallunstack,然后使用 join 到原始 DataFrame:

import re

pattern = '|'.join(map(re.escape, qualities))

out = df.join(df['Student'].str.extractall(f'({pattern})')[0].unstack())

输出:

                      Student       0       1
1             Aysha is clever  clever     NaN
2             Ben is stronger  strong     NaN
3  Cathy is clever and strong  clever  strong
4         Dany is intelligent     NaN     NaN
5             Ella is naughty     NaN     NaN
6             Fred is quieter   quiet     NaN

【讨论】:

  • Mozway 如果我想在拆分后正常访问我的元素,我有疑问,我们使用像这样的索引 str.split()[1] 在列表中给出第一个元素......我如何一次提及范围/提及多个索引,如 [1][3][4] 。 ..它不工作说错误的语法
  • @Bhargav 不确定我是否关注你,你想要operator.itemgetter(1, 3, 4)('A B C D E'.split())吗?
  • 请参阅上面发布的我的答案,我正在使用 new = df["ex"].str.split(pat = ",", expand=True)[1],它在拆分后给了我列表中的第一个元素...如果我想一次像手工挑选的索引一样过滤,我该怎么做...就像如果我想要第一个, 4th, 7th indexes 我如何在拆分后提及...[1][4][7]
【解决方案2】:

使用str.findall,然后用,拆分

df['ex'] = df['Student'].str.findall('|'.join(qualities)).apply(set).str.join(', ')

new = df["ex"].str.split(pat = ",", expand=True)[1]
df =pd.concat([df, new], axis = 1)
df = df.fillna('')
print(df)

给#

                      Student              ex        1
1             Aysha is clever          clever
2             Ben is stronger          strong
3  Cathy is clever and strong  clever, strong   strong
4         Dany is intelligent
5             Ella is naughty
6             Fred is quieter           quiet

【讨论】:

  • 你是什​​么意思“给#”
猜你喜欢
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
  • 2023-01-20
  • 2019-09-17
  • 2023-03-07
  • 2021-07-15
相关资源
最近更新 更多