簡體   English   中英

使用部分字符串匹配將 dataframe 中的列替換為另一個 dataframe 列

[英]Replacing a column in a dataframe with another dataframe column using partial string match

我有帶有以下示例數據框的大型 CSV:

df1 = 
Index    Fruit   Vegetable    
    0    Mango   Spinach
    1    Berry   Carrot
    2    Banana  Cabbage   
df2 = 
Index   Unit                   Price
   0    Mango_123              30
   1    234_Artichoke_CE       45
   2    23_Banana              12
   3    Berry___LE             10
   4    Cabbage___12LW         25
   5    Rice_ww_12             40
   6    Spinach_KJ             34
   7    234_Carrot_23          08
   8    10000_Lentil           12
   9    Pot________12          32

我想替換 df2 中的名稱來替換 df1 中的名稱以創建以下 dataframe:

df3= 
Index    Fruit        Vegetable    
    0    Mango_123    Spinach_KJ
    1    Berry___LE   234_Carrot_23
    2    23_Banana    Cabbage___12LW

這樣做的通用方法是什么? 謝謝你。

您可以將模糊匹配與thefuzz.process.extractOne一起使用,它將使用Levenshtein Distance計算最接近的匹配:

# pip install thefuzz

from thefuzz import process

cols = ['Fruit', 'Vegetable']
df1[cols] = df1[cols].applymap(lambda x: process.extractOne(x, df2['Unit'])[0])

output:

   Index       Fruit       Vegetable
0      0   Mango_123      Spinach_KJ
1      1  Berry___LE   234_Carrot_23
2      2   23_Banana  Cabbage___12LW

使用列表推導可以更好地解決您的問題:

fruit_list = [df2.Unit[df2.Unit.str.contains(x)].values[0] for x in df1.Fruit.tolist()]
vegetable_list = [df2.Unit[df2.Unit.str.contains(x)].values[0] for x in df1.Vegetable.tolist()]

上面的代碼將創建兩個列表,一個將從 df2 中提取所有水果,而另一個將對蔬菜執行相同的操作。 然后,創建一個新的 df 並執行以下操作:

df3 = pd.DataFrame(columns=["Fruit", "Vegetable"])
df3["Fruit"] = fruit_list
df3["Vegetable"] = vegetable_list

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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