【问题标题】:Pandas: expanding/mapping an input vector to N outputsPandas:将输入向量扩展/映射到 N 个输出
【发布时间】:2017-05-17 10:29:56
【问题描述】:

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

在这种形式中,需要多次迭代调用 concat 才能解压缩每一行中的列表。一定有一个更直接的方法,我错过了。

有类似的问题,例如这个Returning multiple values from pandas apply on a DataFrame,但是它们都将输出扩展为单独的列,而我需要它在一个列中。

编辑:正如 IanS 正确指出的那样,possiblities 在这种情况下是

possibilities = ['xyz', 'xzy', 'xxy', 'pqr']

【问题讨论】:

    标签: python pandas


    【解决方案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
    

    【讨论】:

    • 就是这样,谢谢。我对它可以为某些输入返回
    猜你喜欢
    • 1970-01-01
    • 2012-09-12
    • 2019-04-09
    • 1970-01-01
    • 2018-09-01
    • 2021-02-28
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    相关资源
    最近更新 更多