我想将一个具有多个返回的函数应用于 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)
目标是在 a
和 b
上调用 add_subtract
的单个命令在 df
中创建两个新列: sum
和 difference
.
我觉得这样的事情可能有用:
(df['sum'], df['difference']) = df.apply(
lambda row: add_subtract(row['a'], row['b']), axis=1)
但它产生了这个错误:
----> 9 lambda row:add_subtract(row ['a'],row ['b']),axis = 1)ValueError:解包的值太多(预期2)
EDIT: 除了以下答案,pandas apply function that returns multiple values to rows in pandas dataframe表明该函数可以修改为返回列表或 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)
要么
def add_subtract_series(a, b):
return pd.Series((a + b, a - b))
df[['sum', 'difference']] = df.apply(
lambda row: add_subtract_list(row['a'], row['b']), axis=1)
两种都有效(后者相当于温的接受答案) .
2 回答
添加
pd.Series
产量
一种方法是使用
pd.DataFrame.assign
,如下所示:应该产量:
澄清:
zip是一个内置函数,它返回元组的迭代器,其中第i个元组包含来自每个参数序列或迭代的第i个元素 . 例如,
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
.总而言之,当合并时,您将获得如下内容:
按照提供的链接到字典对象前面的
zip
和**
运算符,以更好地了解这些有用的工具如何工作超出此特定示例 .