【问题标题】:Apply function on pairs of rows in Pandas dataframe对 Pandas 数据框中的行对应用函数
【发布时间】:2019-03-13 15:52:14
【问题描述】:

我是 pandas 数据框的新手,我想应用一个在同一列中获取几行的函数。就像你应用函数 diff() 一样,但我想计算文本之间的距离。所以我定义了一个测量距离的函数,我尝试使用 apply 但我不知道如何选择几行。下面我展示了一个我尝试过的示例以及我的预期:

def my_measure_function(x,y):
   return some_distance_calculus(x,y)

>>> from pandas import DataFrame
>>> df = DataFrame({"text": ['hello','hella','hel'], "B": [3,4,4]})
>>> df['dist'] = df.apply(lambda x, y: my_measure_function(x, y), axis=0)

但它不起作用。 我想要得到的是:

>>> df
      text  B  dist
0    hello  3    0
1    hella  4    1
2    hel    4    2

提前感谢您为我提供的任何帮助。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可能希望避免使用pd.DataFrame.apply,如performance may suffer。相反,您可以将mappd.Series.shift 一起使用:

    df['dist'] = list(map(my_measure_function, df['text'], df['text'].shift()))
    

    或者通过列表理解:

    zipper = zip(df['text'], df['text'].shift())
    df['dist'] = [my_measure_function(val1, val2) for val1, val2 in zipper]
    

    【讨论】:

    • 感谢您的建议,但我需要比较同一列中的行,在本例中为“文本”列。我需要计算 'hella' 与 'hello' 和 'hel' 与 'hella' 之间的距离,并将结果放入新的列中。
    • @M.Moresi,啊,我明白了,我在那里添加了几个选项。
    • @Wen,是的,我最近对apply 的体验很糟糕,尽管here 这就是我要避免的原因!
    • @jpp 因为他询问了 apply 函数 - 这就是我使用 apply 的原因
    • 我不得不等待一分钟才能收回我的投票,但你的投票绝对值得 +1 作为最简单的解决方案 :)
    【解决方案2】:

    对于diff,即s-s.shift(),所以在你的函数中你可以这样做

    df['shifttext']=df.text.shift()
    df.apply(lambda x : my_measure_function(x['text'],x['shifttext']))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-29
      • 2019-11-26
      • 1970-01-01
      • 2017-05-23
      • 2020-05-23
      • 2016-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多