我想将一个多次返回的函数应用于pandas DataFrame
,并将结果放在DataFrame
的单独新列中。
所以给出这样的东西:
import pandas as pd
df = pd.DataFrame(data = {'a': [1, 2, 3], 'b': [4, 5, 6]})
def add_subtract(a, b):
return (a + b, a - b)
目标是在add_subtract
和a
上调用b
的单个命令,在df
中创建两个新列:sum
和{{1} }。
我觉得这样的事情可能有用:
difference
但它产生了这个错误:
----> 9 lambda row:add_subtract(row ['a'],row ['b']),axis = 1)
ValueError:解压缩的值太多(预期2)
编辑:除了以下答案之外,pandas apply function that returns multiple values to rows in pandas dataframe表明可以修改该函数以返回列表或(df['sum'], df['difference']) = df.apply(
lambda row: add_subtract(row['a'], row['b']), axis=1)
,即:
Series
或
def add_subtract_list(a, b):
return [a + b, a - b]
df[['sum', 'difference']] = df.apply(
lambda row: add_subtract_list(row['a'], row['b']), axis=1)
两者都有效(后者相当于温的接受答案)。
答案 0 :(得分:3)
添加pd.Series
df[['sum', 'difference']] = df.apply(
lambda row: pd.Series(add_subtract(row['a'], row['b'])), axis=1)
df
产量
a b sum difference
0 1 4 5 -3
1 2 5 7 -3
2 3 6 9 -3
答案 1 :(得分:1)
执行此操作的一种方法是使用pd.DataFrame.assign
,如下所示:
df.assign(**{k:v for k,v in zip(['sum', 'difference'], add_subtract(df.a, df.b))})
应该屈服:
a b difference sum
0 1 4 -3 5
1 2 5 -3 7
2 3 6 -3 9
zip
是一个内置函数,它返回元组的迭代器,其中 i-th元组包含来自每个参数的 i-th元素序列或迭代。例如,list(zip(['sum', 'difference'], [df.a + df.b], df.a - df.b))
应该返回[('sum', df.a + df.b), ('difference', df.a - df.b)]
。
**
用作解包key
和value
对组合的运算符。从本质上讲,解包可以表示为:sum=df.a + df.b, difference=df.a - df.b
。
总而言之,如果合并,您将获得以下内容:
df.assign(sum=df.a + df.b, difference=df.a - df.b)
在词典对象前面跟随zip
和**
运算符的提供链接,以更好地了解这些有用工具如何在此特定示例之外工作。