使用部分字符串匹配将数据框中的列替换为另一个数据框列

Posted

技术标签:

【中文标题】使用部分字符串匹配将数据框中的列替换为另一个数据框列【英文标题】:Replacing a column in a dataframe with another dataframe column using partial string match 【发布时间】:2022-01-17 06:54:22 【问题描述】:

我有带有以下示例数据框的大型 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 中的名称以创建以下数据框:

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

执行此操作的通用方法是什么?谢谢。

【问题讨论】:

更新:模糊匹配不适用于我的数据集。我会很感激一种使用正则表达式的方法。 【参考方案1】:

您可以对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])

输出:

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

【讨论】:

它不适用于我的数据集,如果可能的话,我更喜欢基于字符串匹配的实现。 请详细说明它是如何不起作用的,并给出一个具体的数据示例 很遗憾,我无法共享数据集。我接受答案,因为它适用于我给出的示例。在我的数据集中,df1 还包含名称前后的下划线和数字。因此,模糊逻辑会根据其计算的距离在水果和蔬菜列下分配错误的单位名称。【参考方案2】:

使用列表推导可以更好地解决您的问题:

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

【讨论】:

以上是关于使用部分字符串匹配将数据框中的列替换为另一个数据框列的主要内容,如果未能解决你的问题,请参考以下文章

替换熊猫数据框中部分匹配字符串的列名

将数据框特定列中的 Nan 值替换为另一个数据框特定列中的值

用列不匹配的另一个数据框中的数据填充数据框[关闭]

将具有多个键的 Python 字典映射到具有多个匹配键的列的数据框中

替换与数据框中特定字符串匹配的值

加入后替换pyspark数据框中的列