我正在使用difflib的get_closest_matches为输入向量中的每个值返回N = 3个最佳匹配。我想将输出存储在数据框的单个列中,例如:
input output
"xyz" "xyz"
"xyz" "xzy"
"xyz" "xxy"
"pqr" "pqr"
...
我应该从应用调用中返回什么,它会自动将输入扩展/广播到N个输出?例如,这将以列表形式返回输出:
data["output"] = data["input"].apply(lambda x: difflib.get_close_matches(x, possibilities))
在这种形式中,需要多次迭代调用来连接以解压每行中的列表。我必须有一个更加直截了当的方法。
有类似的问题,比如这个问题Returning multiple values from pandas apply on a DataFrame,但它们都将输出扩展为单独的列,而我需要在一个列中。
编辑:正如IanS正确指出的那样,possiblities
在这种情况下是
possibilities = ['xyz', 'xzy', 'xxy', 'pqr']
答案 0 :(得分:1)
使用以下示例:
possibilities = ['xyz', 'xzy', 'xxy', 'pqr']
首先,将输出设为pandas系列,结果分为三列:
output = data["input"].apply(
lambda x: pd.Series(difflib.get_close_matches(x, possibilities))
)
输出:
0 1 2
0 xyz xzy xxy
1 pqr NaN NaN
第二次,加入和取消堆叠,你几乎就要去了:
result = data.join(output).set_index('input').unstack()
输出:
input
0 xyz xyz
pqr pqr
1 xyz xzy
pqr NaN
2 xyz xxy
pqr NaN
第三次,剩下的只是一些美化,例如:
result.rename('output').reset_index(level=1).sort_values('input').dropna()
输出:
input output
0 pqr pqr
0 xyz xyz
1 xyz xzy
2 xyz xxy