python - 反向查找列表字典中的子字符串

标签 python pandas list dictionary categories

我正在努力寻找一种“pythonic”方式来使这个逻辑起作用:

我有一个包含一列字符串(“受益人”)的支付交易数据框:

<表类="s-表"> <头> 索引 受益人 <正文> 12 REWE SAGT DANKE。 ... 13 NaN 14 OBI BAU- U. HEIMWER//BERLIN/DE/OBI SAGT DANKE 15 Netflix 国际有限公司

我需要在我的数据框中创建另一列,这将是每一行所属的类别。

<表类="s-表"> <头> 索引 受益人 类别 <正文> 12 REWE SAGT DANKE。 ... 杂货 14 OBI BAU- U. HEIMWER//BERLIN/DE/OBI SAGT DANKE 杂货 15 Netflix 国际有限公司 娱乐

我正在考虑制作一个像下面这样的字典,并以某种方式反向查找类别字典中带有上面列的子字符串值:

categories = {"Groceries": ["EDEKA", "REWE", "OBI"],
            "Entertainment": ["NETFLIX"]}

逻辑是:如果子字符串“REWE”在 df['beneficiary'] 中,则 df['category'] 等于子字符串所在的 dict 元素的键。

我对其他映射逻辑持开放态度。

最佳答案

您可以使用正则表达式,为此您需要修改字典以将匹配的字符串作为键并将类别作为值:

categories = {"Groceries": ["EDEKA", "REWE", "OBI"],
              "Entertainment": ["NETFLIX"]}

cat_sub = {v:k for k,l in categories.items() for v in l}
regex = r'(%s)' % '|'.join(fr'\b{c}\b' for c in cat_sub)
# regex looks like this: (\bEDEKA\b|\bREWE\b|\bOBI\b|\bNETFLIX\b)

df['category'] = df['beneficiary'].str.extract(regex, expand=False).map(cat_sub)

注意。我使用单词边界 (\b) 来确保匹配完整的单词,如果您不这样做,请使用 regex = r'(%s)' % '|'.join(cat_sub) '想要这种行为

输出:

   index                                       beneficiary       category
0      12                             REWE SAGT DANKE. ...      Groceries
1      13                                              NaN            NaN
2      14  OBI BAU- U. HEIMWER//BERLIN/DE / OBI SAGT DANKE      Groceries
3      15                       NETFLIX INTERNATIONAL B.V.  Entertainment

注意。如果需要删除 NaN,请使用 dropna

关于python - 反向查找列表字典中的子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69903242/

相关文章:

python - 在 mysql 上使用 pandas 和 sqlalchemy 将元组保存到数据库

json - R:将具有空元素的嵌套列表转换为 data.frame(来自 json)

python - 如何将以下 Tensorflow 代码转换为 Pytorch(迁移学习)?

python - 从部分分类列获取 value_counts

python - Jupyter Notebook - ModuleNotFoundError

python - 根据子列表的长度删除列表的子列表

python - 内存错误分配 11,464,882 个空字典的列表

python - 如何根据 ID 号列表乘以列值?

python - 无法在 Python 中使用 re.sub 进行就地替换

python - 如何使用spark sql获取多个表