Python 将函数应用于dataframe的两列以获得两个新列

Python 将函数应用于dataframe的两列以获得两个新列,python,pandas,multiple-columns,apply,Python,Pandas,Multiple Columns,Apply,我有一个pandas数据框,其中包含列经度和纬度。我想从他们那里得到X和Y。utm中有一个函数,名为from_latlon,用于执行此操作。它接收纬度和经度,并给出[X,Y]。我是这样做的: def get_X(行): 从_latlon(第['纬度],第['经度]行)返回utm.[0] def get_Y(世界其他地区): 从_latlon(第['纬度]行,第['经度]行)返回utm.[1] df['X']=df.apply(获取X,轴=1) df['Y']=df.apply(获取Y,轴=1)

我有一个pandas数据框,其中包含列
经度
纬度
。我想从他们那里得到
X
Y
utm
中有一个函数,名为
from_latlon
,用于执行此操作。它接收
纬度
经度
,并给出
[X,Y]
。我是这样做的:

def get_X(行):
从_latlon(第['纬度],第['经度]行)返回utm.[0]
def get_Y(世界其他地区):
从_latlon(第['纬度]行,第['经度]行)返回utm.[1]
df['X']=df.apply(获取X,轴=1)
df['Y']=df.apply(获取Y,轴=1)

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

您可以从函数返回列表:

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

我合并了一个类似线程中的两个答案,现在有了一个通用的多列输入,多列输出模板,我在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))

基于您的第一个解决方案,我使用
temp=d.apply(foo,axis=1)
,然后执行
d['sum']=[temp中的项[0]
d['subtract']=[temp中的项[1]
。有没有更好的办法。如果我做了
d[['sum','subtract']]=d.apply(foo,axis=1)
我会得到一个错误。我想这是一个将结果返回到原始数据帧的问题。不幸的是,由于我的特殊功能,您的第二个解决方案对我不起作用。谢谢。@bikhaab:没有简单的方法可以将多个列同时分配到一个数据帧中,所以这是一个单独的问题。您可以使用
concat
merge
将结果数据框与原始数据框连接起来。有关一些相关的想法,请参阅。