使用部分字符串匹配将数据框中的列替换为另一个数据框列
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 中的名称以创建以下数据框:
df3=
Index Fruit Vegetable
0 Mango_123 Spinach_KJ
1 Berry___LE 234_Carrot_23
2 23_Banana Cabbage___12LW
执行此操作的通用方法是什么?谢谢。
您可以使用 thefuzz.process.extractOne
, that will compute the closest match using 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
你的问题将通过使用列表理解得到更好的解决:
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
我有包含以下样本数据帧的大型 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
执行此操作的通用方法是什么?谢谢。
您可以使用 thefuzz.process.extractOne
, that will compute the closest match using 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
你的问题将通过使用列表理解得到更好的解决:
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