熊猫:将输入向量扩展/映射到N个输出

时间:2017-01-03 10:44:15

标签: python pandas

我正在使用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']

1 个答案:

答案 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