如何使用不区分大小写的匹配根据字典对 pandas 数据框进行子集化
How to subset a pandas data-frame based on a dictionary using case-insensitive matching
我有一个包含各种产品及其描述的数据框,如下图所示:
我有一个字典,其中包含必须根据其进行过滤的键值对:
ent_dict
{'brand': 'Dexter', 'color': 'brown', 'product': 'footwear', 'size': '32'}
可以看出,dict 和 dataframe 可能包含不同情况下的值,因此我需要在这里进行不区分大小写的匹配。也可能有一些列是正常匹配的数字列。
那么有人可以帮助我吗?
以上适用于字符串匹配。您还可以进一步更改最终语句以匹配整数。
import numpy as np
import pandas as pd
import re
df = pd.DataFrame({'Product': np.array(['Footwear' for i in range(4)]), 'Category': np.array(['Women' for i in range(4)]), 'Size': np.array([7, 7, 7, 8]), 'Color': np.array(['black', 'brown', 'blue', 'black'])})
ent_dict = {'Category': 'Women', 'Color': 'black', 'Product': 'Footwear'}
values = [i for i in ent_dict.values()]
columns = [df.filter(regex=re.compile(i, re.IGNORECASE)).columns[0] for i in ent_dict]
df[eval(" & ".join(["(df['{0}'] == {1})".format(col, repr(cond))
for col, cond in zip(columns, values)]))]
不区分大小写的搜索可以使用 DataFrame
对象的 str.contains
来完成。
df[eval(" & ".join(["(df['{0}'].str.contains({1}, case=False))".format(col, repr(cond))
for col, cond in zip(columns, values)]))]
我有一个包含各种产品及其描述的数据框,如下图所示:
我有一个字典,其中包含必须根据其进行过滤的键值对:
ent_dict
{'brand': 'Dexter', 'color': 'brown', 'product': 'footwear', 'size': '32'}
可以看出,dict 和 dataframe 可能包含不同情况下的值,因此我需要在这里进行不区分大小写的匹配。也可能有一些列是正常匹配的数字列。 那么有人可以帮助我吗?
以上适用于字符串匹配。您还可以进一步更改最终语句以匹配整数。
import numpy as np
import pandas as pd
import re
df = pd.DataFrame({'Product': np.array(['Footwear' for i in range(4)]), 'Category': np.array(['Women' for i in range(4)]), 'Size': np.array([7, 7, 7, 8]), 'Color': np.array(['black', 'brown', 'blue', 'black'])})
ent_dict = {'Category': 'Women', 'Color': 'black', 'Product': 'Footwear'}
values = [i for i in ent_dict.values()]
columns = [df.filter(regex=re.compile(i, re.IGNORECASE)).columns[0] for i in ent_dict]
df[eval(" & ".join(["(df['{0}'] == {1})".format(col, repr(cond))
for col, cond in zip(columns, values)]))]
不区分大小写的搜索可以使用 DataFrame
对象的 str.contains
来完成。
df[eval(" & ".join(["(df['{0}'].str.contains({1}, case=False))".format(col, repr(cond))
for col, cond in zip(columns, values)]))]