使用 for 循环在 panda 列中动态生成对象名称(fuzzywuzzy)
Dynamically generating an object's name in a panda column using a for loop (fuzzywuzzy)
低级 python 技能(使用 SAS 学习编程)。
我正在尝试对存储在基本数据框中的字符串对应用一系列模糊字符串匹配 (fuzzywuzzy lib) 公式。现在我对如何去做感到矛盾。
我是否应该编写一个循环为每个公式创建一个特定的数据框,然后将所有这些子数据框附加到一个数据框中?这种方法的问题似乎在于,由于我无法动态命名子数据框,结果值在循环的每一轮都会被覆盖。
或者我应该在一个循环中创建一个数据框,将我的公式名称和表达式作为字典?这里的麻烦给我和上面一样的问题。
这是我的公式字典:
# ratios dict: all ratios names and functions
ratios = {"ratio": fuzz.ratio,
"partial ratio": fuzz.partial_ratio,
"token sort ratio": fuzz.token_sort_ratio,
"partial token sort ratio": fuzz.partial_token_sort_ratio,
"token set ratio": fuzz.token_set_ratio,
"partial token set ratio": fuzz.partial_token_set_ratio
}
这是我目前正在努力的循环:
# for loop iterating over ratios
for r, rn in ratios.items():
# fuzzing function definition
def do_the_fuzz(row):
return rn(row[base_column], row[target_column])
# new base df containing ratio data and calculations for current loop turn
df_out1 = pd.DataFrame(data = df_out, columns = [base_column, target_column, 'mesure', 'valeur', 'drop'])
df_out1['mesure'] = r
df_out1['valeur'] = df_out.apply(do_the_fuzz, axis = 1)
它给了我同样的问题,即 'mesure' 列被覆盖,我最终得到一个充满最后一个值的列(这里:'partial token set')。
我的总体问题是我无法理解是否以及如何在 python 循环中动态命名数据框、列或值(或者我是否应该这样做)。
我自己想出一个解决方案已经太久了,但我就是想不出来。任何见解将不胜感激!提前谢谢了!
我将创建一个在每次循环迭代时更新的数据框:
final_df = pd.DataFrame()
for r, rn in ratios.items():
...
df_out1 = pd.DataFrame(data = df_out, columns = [base_column, target_column, 'mesure', 'valeur', 'drop'])
df_out1['mesure'] = r
df_out1['valeur'] = df_out.apply(do_the_fuzz, axis = 1)
final_df = pd.concat([final_dfl, df_out1], axis=0)
希望对您有所帮助
低级 python 技能(使用 SAS 学习编程)。
我正在尝试对存储在基本数据框中的字符串对应用一系列模糊字符串匹配 (fuzzywuzzy lib) 公式。现在我对如何去做感到矛盾。
我是否应该编写一个循环为每个公式创建一个特定的数据框,然后将所有这些子数据框附加到一个数据框中?这种方法的问题似乎在于,由于我无法动态命名子数据框,结果值在循环的每一轮都会被覆盖。
或者我应该在一个循环中创建一个数据框,将我的公式名称和表达式作为字典?这里的麻烦给我和上面一样的问题。
这是我的公式字典:
# ratios dict: all ratios names and functions
ratios = {"ratio": fuzz.ratio,
"partial ratio": fuzz.partial_ratio,
"token sort ratio": fuzz.token_sort_ratio,
"partial token sort ratio": fuzz.partial_token_sort_ratio,
"token set ratio": fuzz.token_set_ratio,
"partial token set ratio": fuzz.partial_token_set_ratio
}
这是我目前正在努力的循环:
# for loop iterating over ratios
for r, rn in ratios.items():
# fuzzing function definition
def do_the_fuzz(row):
return rn(row[base_column], row[target_column])
# new base df containing ratio data and calculations for current loop turn
df_out1 = pd.DataFrame(data = df_out, columns = [base_column, target_column, 'mesure', 'valeur', 'drop'])
df_out1['mesure'] = r
df_out1['valeur'] = df_out.apply(do_the_fuzz, axis = 1)
它给了我同样的问题,即 'mesure' 列被覆盖,我最终得到一个充满最后一个值的列(这里:'partial token set')。
我的总体问题是我无法理解是否以及如何在 python 循环中动态命名数据框、列或值(或者我是否应该这样做)。
我自己想出一个解决方案已经太久了,但我就是想不出来。任何见解将不胜感激!提前谢谢了!
我将创建一个在每次循环迭代时更新的数据框:
final_df = pd.DataFrame()
for r, rn in ratios.items():
...
df_out1 = pd.DataFrame(data = df_out, columns = [base_column, target_column, 'mesure', 'valeur', 'drop'])
df_out1['mesure'] = r
df_out1['valeur'] = df_out.apply(do_the_fuzz, axis = 1)
final_df = pd.concat([final_dfl, df_out1], axis=0)
希望对您有所帮助