将函数应用于pandas dataframe的两列以获取两个新列

2024-04-29 13:47:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pandas数据框,其中有LongitudeLatitude列。我想从他们那里得到XY。在utm中有一个名为from_latlon的函数来执行此操作。它接收LatitudeLongitude,并给出[X,Y]。我做的是:

    def get_X(row):
        return utm.from_latlon(row['Latitude'], row['Longitude'])[0]

    def get_Y(row):
        return utm.from_latlon(row['Latitude'], row['Longitude'])[1] 

    df['X'] = df.apply(get_X, axis=1)
    df['Y'] = df.apply(get_Y, axis=1)

我想定义一个函数get_XY,并只应用from_latlon一次以节省时间。我看了一下hereherehere,但是我找不到一种方法来用一个apply函数生成两列。谢谢。


Tags: 函数frompandasdfgetreturnheredef
2条回答

我从一个类似的线程中合并了几个答案,现在有一个通用的多列输入、多列输出模板,我在Jupyter/pandas中使用:

# plain old function doesn't know about rows/columns, it just does its job.
def my_func(arg1,arg2):
    return arg1+arg2, arg1-arg2  # return multiple responses

df['sum'],df['difference'] = zip(*df.apply(lambda x: my_func(x['first'],x['second']),axis=1))

您可以从函数返回列表:

d = pandas.DataFrame({
    "A": [1, 2, 3, 4, 5],
    "B": [8, 88, 0, -8, -88]
})

def foo(row):
    return [row["A"]+row["B"], row["A"]-row["B"]]

>>> d.apply(foo, axis=1)
    A   B
0   9  -7
1  90 -86
2   3   3
3  -4  12
4 -83  93

也可以返回序列。这允许您指定返回值的列名:

def foo(row):
    return pandas.Series({"X": row["A"]+row["B"], "Y": row["A"]-row["B"]})

>>> d.apply(foo, axis=1)
    X   Y
0   9  -7
1  90 -86
2   3   3
3  -4  12
4 -83  93

相关问题 更多 >