我有一个列表列表,列表的每个子列表都包含从数据帧过滤文本的关键字.

keywords = [[('tarifa',), ('mantenimiento',), ('mensual',)],  
[('tasa',), ('anual',)],    
[('seguro',), ('bancaria',)],  
[('seguro',), ('generales',)],  
[('mi salud',), ('unific',)]] 

我以前通过手动键入关键字进行筛选,如下所示:

#for sublist 1:
kw_s = kw_df[kw_df['transaction_description'].str.contains('tarifa') & kw_df['transaction_description'].str.contains('mantenimiento') & kw_df['transaction_description'].str.contains('mensual')]
#for sublist 2:
kw_s = kw_df[kw_df['transaction_description'].str.contains('seguro') & kw_df['transaction_description'].str.contains('generales')]

现在,我必须根据mysql表中配置的关键字进行过滤.因此,我将关键字保存在一个列表列表中,但我不知道如何通过子列表提取关键字来过滤数据帧.

你知道我该怎么做吗?

下面是数据帧的一个示例

user_id reg_id    date                           transaction_description          value
kw_df = [[5,  56,  Timestamp('2022-01-29 00:00:00'),  'pac c.misalud conv. unificado',  12320.0],
[5,  57,  Timestamp('2021-12-19 00:00:00'),  'cargo seguro proteccion bancaria',  31222.0], 
[5,  60,  Timestamp('2021-04-06 00:00:00'),  'pac sura cia seguros generales',  8657.0],
[5,  178,  Timestamp('2022-03-21 00:00:00'),  'cargo seguro proteccion bancaria',  31222.0], 
[5,  179,  Timestamp('2022-03-01 00:00:00'),  'pac c.misalud conv. unificado',  12320.0], 
[5,  182,  Timestamp('2022-03-15 00:00:00'),  'pac sura cia seguros generales',  8657.0],
[5,  189,  Timestamp('2022-04-21 00:00:00'),  'cargo seguro proteccion bancaria',  31222.0],
[5,  190,  Timestamp('2022-04-01 00:00:00'),  'pac c.misalud conv. unificado',  12320.0],
[5,  193,  Timestamp('2022-04-15 00:00:00'),  'pac sura cia seguros generales',  8657.0],
[5,  206,  Timestamp('2022-05-21 00:00:00'),  'cargo seguro proteccion bancaria',  31222.0],
[5,  256,  Timestamp('2022-06-17 00:00:00'),  'cargo seguro proteccion bancaria',  40222.0]]

推荐答案

How to filter a DataFrame by a volatile subset of words?

虚拟数据

import numpy as np
import pandas as pd

columns = ['transaction_description', 'value']
data = [
    ['pac c.misalud conv. unificado', 12320.0],
    ['cargo seguro proteccion bancaria', 31222.0], 
    ['pac sura cia seguros generales', 8657.0],
    ['cargo seguro proteccion bancaria', 31222.0], 
    ['pac c.misalud conv. unificado', 12320.0], 
    ['pac sura cia seguros generales', 8657.0],
    ['cargo seguro proteccion bancaria', 31222.0],
    ['pac c.misalud conv. unificado', 12320.0],
    ['pac sura cia seguros generales', 8657.0],
    ['cargo seguro proteccion bancaria', 31222.0],
    ['cargo seguro proteccion bancaria', 40222.0]]

df=pd.DataFrame(data, columns=columns)

keywords = [
    [('tarifa',), ('mantenimiento',), ('mensual',)], 
    [('tasa',), ('anual',)],    
    [('seguro',), ('bancaria',)],  
    [('seguro',), ('generales',)],  
    [('mi salud',), ('unific',)]]

正在解决

我将使用一种 struct ,其中子列表中的单词按列排列,或者准确地说,每个单词都作为元组的唯一元素放置在列表中.

让我们将str.__contains__矢量化,使str1 in str2代码适用于数组:

contains = np.vectorize(str.__contains__)

现在,我将在df["transaction_description"]和第四组关键字[('seguro',), ('generales',)]上测试此函数,例如:

desc = df['transaction_description']
contains(desc, keywords[3])

在这种情况下,我们得到以下结果:

array([[False,  True,  True,  True, False,  True,  True, False,  True,  True,  True],
       [False, False,  True, False, False,  True, False, False,  True, False, False]])

现在,为了查看该子集的所有单词是否都可以在描述中找到,我们沿着前面矩阵的第一个索引应用方法all:

df[contains(desc, keywords[3]).all(axis=0)]

我们得到这些过滤数据:

          transaction_description   value
2  pac sura cia seguros generales  8657.0
5  pac sura cia seguros generales  8657.0
8  pac sura cia seguros generales  8657.0

长话短说

contains = np.vectorize(str.__contains__)
desc = df['transaction_description']
contain_all = lambda words: df[contains(desc, words).all(axis=0)]

the code and its output

Python相关问答推荐

脚注在Python中使用regex导致错误匹配

在Python中,如何才能/应该使用decorator 来实现函数多态性?

Flask主机持续 bootstrap 本地IP| Python

Polars Select 多个元素产品

KNN分类器中的GridSearchCV

Pandas :多索引组

列表上值总和最多为K(以O(log n))的最大元素数

线性模型PanelOLS和statmodels OLS之间的区别

使用SciPy进行曲线匹配未能给出正确的匹配

韦尔福德方差与Numpy方差不同

Matlab中是否有Python的f-字符串等效物

沿着数组中的轴计算真实条目

Python,Fitting into a System of Equations

Pandas DataFrame中行之间的差异

python中的解释会在后台调用函数吗?

实现神经网络代码时的TypeError

在Python 3中,如何让客户端打开一个套接字到服务器,发送一行JSON编码的数据,读回一行JSON编码的数据,然后继续?

解决调用嵌入式函数的XSLT中表达式的语法移位/归约冲突

处理具有多个独立头的CSV文件

替换现有列名中的字符,而不创建新列