我从stackoverflow上真的找不到任何好的解决方案。通过遍历列表并将值分配给新列,我设法获得了完整的单词匹配。 我想df.lookup以及df.get_value可能也可以以某种方式用于实现相同目的。
这是我首先工作的解决方案。这是用于查找完整单词的方法,但是基于通配符查找并获得第一个结果的最佳方法是什么?例如,有一个银行交易清单,试图与商店名称匹配以分配类别。
import pandas as pd
df = pd.read_csv("transactions.csv")
d = {
'SUBWAY': '9',
'TRANSFER TO': '5',
'Best Buy': '8'
}
for index, row in df.iterrows():
if(row['Description'] in d.keys()):
df.at[index, 'Category'] = d[row['Description']]
答案 0 :(得分:3)
对于在 df['Description']
内的字典键的部分匹配,您可以迭代字典而不是数据帧的:
d = {'IKEA': '9', 'TRANSFER TO SAVINGS': '5', 'Best buy': '8'}
for k, v in d.items():
df.loc[df['Description'].str.contains(k), 'Category'] = v
假设相对于字典键,您有很多行,那么这比迭代行要有效得多。
请谨慎处理字典顺序。在v3.7之前的版本中,不应假定已订购字典。在CPython v3.6和v3.7 +中,字典按插入顺序排列。以上逻辑将确保 last 匹配棒。
对于完全匹配,您可以使用pd.Series.map
后跟fillna
:
d = {'IKEA': '9', 'TRANSFER TO SAVINGS': '5', 'Best buy': '8'}
df['Category'] = df['Description'].map(d).fillna(df['Category'])
fillna
很重要,因为对于'Category'
不在NaN
中的情况,您不想用'Description'
覆盖d
中的现有值。
通常可以通过less efficient来避免fillna
的{{3}}替代方案。