将功能按行应用于熊猫数据框

时间:2020-05-21 19:13:56

标签: python pandas function apply

我必须根据2D坐标计算希尔伯特曲线上的距离。为此,我使用hilbertcurve程序包构建了自己的“ hilbert”功能。坐标存储在数据框中(col_1和col_2)。如您所见,我的函数在应用于两个值(测试)时有效。

但是,当通过apply功能逐行应用时,它只是不起作用!为什么是这样?我在这里做错了什么?我需要另外一列“ 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().

谢谢您的帮助!

2 个答案:

答案 0 :(得分:2)

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

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

以便给定的lambda函数将应用于每一行。

答案 1 :(得分:0)

您必须将轴定义为1,因为要在行而不是列上应用函数。

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

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