如何通过易失的单词子集过滤 DataFrame?
虚拟数据
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',)]]
Solving
我将使用一种结构,其中子列表的单词按列排列,或者准确地说,每个单词都作为元组的唯一元素放置在列表中。
让我们向量化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)]