验证数据框是否包含列表字典中的内容

Thu*_*tra 3 python pandas

我意识到标题有点模糊,但让我说明一下。

我有一个数据框(简化)如下所示:

Date | transaction | amount

01-01-2020 | something keywordA something | 50

01-01-2020 | something something keywordB | 152

02-01-2020 | keywordA something else | 200
Run Code Online (Sandbox Code Playgroud)

等等

然后我做的第一件事是添加一个名为“类别”的空列,如下所示:

df['Category'] = ''
Run Code Online (Sandbox Code Playgroud)

现在我还有一个像这样的列表字典:

categories={'category A':['keywordA','keywordB'], 'category B':['keywordC']}
Run Code Online (Sandbox Code Playgroud)

等等

现在我想要做的是查看每一行的事务列是否包含关键字之一,以及它是否包含例如。关键字A 我希望用“类别A”填充类别列。

所以首先,我不确定使用列表字典是否是这里的方法。其次,我可能会逐行进行,执行 contains 类型函数并与 dict 中的每个项目进行比较,但是从我读到的内容来看,当您使用 Pandas 时,对每一行进行迭代通常是不好的做法,而且直观地说,这将非常糟糕。

所以..关于我应该看哪个方向的任何提示?

ank*_*_91 5

据我了解,您可以使用series.str.extractseries.map反转字典后执行此操作:

d = {a:k for k,v in categories.items() for a in v}
#{'keywordA': 'category A', 'keywordB': 'category A', 'keywordC': 'category B'}
pat = r'\b(?:{})\b'.format('|'.join(d.keys()))
df['Category'] = df['transaction'].str.extract('('+pat+')',expand=False).map(d)
Run Code Online (Sandbox Code Playgroud)
print(df)

        Date                   transaction  amount    Category
0 2020-01-01  something keywordA something      50  category A
1 2020-01-01  something something keywordB     152  category A
2 2020-02-01       keywordA something else     200  category A
Run Code Online (Sandbox Code Playgroud)