[英]How to add a pandas column based on partial string match?
我有一個 pandas dataframe 的各種尚未定義的類別(汽油、雜貨、快餐等)的信用卡費用。
df1:
Category Date Description Cost
nan 7.1.20 Chipotle Downtown West $8.23
nan 7.1.20 Break Time - Springfield $23.57
nan 7.3.20 State Farm - Agent $94.23
nan 7.3.20 T-Mobile $132.42
nan 7.4.20 Venmo -xj8382dzavvd $8.00
nan 7.6.20 Broadway McDonald's $11.73
nan 7.8.20 Break Time - Townsville $44.23
我想維護第二個 dataframe 搜索描述中的關鍵字並填充“類別”列。 如下所示:
df2:
item category
mcdonald fast food
state farm insurance
break time gas
chipotle fast food
mobile cell phone
這里的想法是我將編寫代碼行來搜索df1['Description']
中的部分字符串並使用df2[category]
中的值填充df1['Category']
] 。
我確信有一種干凈且 Pythonic 的方式來處理這段代碼,但下面是我能得到的最接近的方式。 下面代碼的錯誤結果是包含匹配項的df1['Category']
的所有行都設置為 df2 中的最后一個循環(例如,在這種情況下,所有行都將設置為“手機”)。
for x in df2['item']:
for y in df2['category']:
df1['Category'] = np.where(
df1['Description'].str.lower().str.contains(x),
y,
df1['Category'])
謝謝你的幫助!
您可以使用 map、Python 的內置 difflib 接近匹配 function 和 lambda 表達式來執行此操作。 difflib 調用返回字符串匹配列表,您可以根據需要調整截止參數以獲得或多或少的靈敏度。
import difflib
# you'll need to change both cutoff values here for the lambda to work correctly
df1['Category'] = df1['Description'].map(lambda x: difflib.get_close_matches(x, df2['item'], cutoff=0.3)[0] if len(difflib.get_close_matches(x, df2['item'], cutoff=0.3)) > 1 else 'no match')
print(df1)
Category Date Description Cost
0 chipotle 7.1.20 Chipotle Downtown West $8.23
1 break time 7.1.20 Break Time - Springfield $23.57
2 state farm 7.3.20 State Farm - Agent $94.23
3 mobile 7.3.20 T-Mobile $132.42
4 no match 7.4.20 Venmo -xj8382dzavvd $8.00
5 mcdonald 7.6.20 Broadway McDonald's $11.73
6 break time 7.8.20 Break Time - Townsville $44.23
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.