Python 验证dataframe是否包含列表目录中的内容
我知道标题有点模糊,但让我举例说明 我有一个数据帧(简化)如下所示:Python 验证dataframe是否包含列表目录中的内容,python,pandas,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 df['Category'] = '' categories={'category A'
Date | transaction | amount
01-01-2020 | something keywordA something | 50
01-01-2020 | something something keywordB | 152
02-01-2020 | keywordA something else | 200
df['Category'] = ''
categories={'category A':['keywordA','keywordB'], 'category B':['keywordC']}
等
然后,我要做的第一件事是添加一个名为“category”的空列,如下所示:
Date | transaction | amount
01-01-2020 | something keywordA something | 50
01-01-2020 | something something keywordB | 152
02-01-2020 | keywordA something else | 200
df['Category'] = ''
categories={'category A':['keywordA','keywordB'], 'category B':['keywordC']}
现在,我还有一份清单,如下所示:
Date | transaction | amount
01-01-2020 | something keywordA something | 50
01-01-2020 | something something keywordB | 152
02-01-2020 | keywordA something else | 200
df['Category'] = ''
categories={'category A':['keywordA','keywordB'], 'category B':['keywordC']}
等
现在我想做的是看看每一行的事务列是否包含一个关键字,如果它包含例如关键字A,我想用“category A”填充category列
所以首先,我不确定使用列表的方式是否可行。其次,我可能会一行一行地去做一个contains类型函数,并与dict中的每一项进行比较,但是从我所读到的内容来看,当你使用pandas时,迭代每一行通常是不好的做法,直觉上这将非常糟糕
所以。。关于我应该看哪个方向的任何提示?据我所知,您可以在反转字典后使用
series.str.extract
和series.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)
嗨,我来试试。但是,在休息了4-5年之后,我刚刚回到python,介意解释一下第二行到底做了什么吗?我得到了第一行,你基本上做了一个新的dict,其中键是列表项,值等于原始键。第三行从事务字符串中提取一个模式并将其映射到新的dict。但是模式定义有点抽象。@Thustra第二行定义了一个模式,该模式通过管道连接新形成的字典的键,并使用一个
'\b'
格式化,它是一个,以便在映射类别之前检查精确的单词匹配。。!!这就像一个魅力:)非常感谢,我仍然需要努力了解如何,但更容易阅读的文件与你知道的东西,工作就在那里。