【问题标题】:Apply function row wise to pandas dataframe将函数行明智地应用于熊猫数据框
【发布时间】:2020-09-08 12:48:32
【问题描述】:

我必须从二维坐标计算希尔伯特曲线上的距离。使用 hilbertcurve-package 我构建了我自己的“hilbert”-function,来做到这一点。坐标存储在数据框(col_1 和 col_2)中。如您所见,我的函数在应用于两个值(测试)时有效。

但是,当通过应用功能逐行应用时,它就不起作用了!为什么是这样?我在这里做错了什么?我需要一个额外的列“hilbert”,其中包含与列“col_1”和“col_2”中给出的 x 和 y 坐标的希尔伯特距离。

import pandas as pd
from hilbertcurve.hilbertcurve import HilbertCurve

df = pd.DataFrame({'ID': ['1', '2', '3'],
                   'col_1': [0, 2, 3],
                   'col_2': [1, 4, 5]})


def hilbert(x, y):
    n = 2
    p = 7
    hilcur = HilbertCurve(p, n)
    dist = hilcur.distance_from_coordinates([x, y])
    return dist


test = hilbert(df.col_1[2], df.col_2[2])

df["hilbert"] = df.apply(hilbert(df.col_1, df.col_2), axis=0)

最后一条命令以错误结束:

The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

感谢您的帮助!

【问题讨论】:

    标签: python pandas function apply


    【解决方案1】:

    由于您在应用程序中有hilbert(df.col_1, df.col_2),因此会立即尝试使用这两列的完整pd.Serieses 调用您的函数,从而触发该错误。你应该做的是:

    df.apply(lambda x: hilbert(x['col_1'], x['col_2']), axis=1)
    

    这样给定的 lambda 函数将应用于每一行。

    【讨论】:

    • 感谢您的回答,但是当用您的解决方案替换最后一行时: df["hilbert"] = df.apply(lambda x: hilbert(x["col_1"], x["col_2 "]), axis=0) 它说 KeyError: ('col_1', 'occured at index ID')
    • 在您拥有 axis=0 而应该是 axis=1 之后注意到 - 再试一次。
    • 啊,我明白了!谢谢!
    【解决方案2】:

    您必须将轴定义为 1,因为您希望将函数应用于行,而不是列。

    您可以定义一个 lambda 函数以仅对两行应用希尔伯特,如下所示:

    df['hilbert'] = df.apply(lambda row: hilbert(row['col_1'], row['col_2']), axis=1)
    

    【讨论】:

      猜你喜欢
      • 2018-11-13
      • 1970-01-01
      • 2019-02-07
      • 2013-08-10
      • 2021-02-12
      • 2022-01-04
      • 1970-01-01
      • 2020-12-02
      相关资源
      最近更新 更多