簡體   English   中英

如何根據部分字符串匹配添加 pandas 列?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM