通过应用具有多个返回的函数创建多个pandas DataFrame列

时间:2017-12-26 20:37:26

标签: python pandas

我想将一个多次返回的函数应用于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_subtracta上调用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)

两者都有效(后者相当于温的接受答案)。

2 个答案:

答案 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)]

字典对象前面的

**用作解包keyvalue对组合的运算符。从本质上讲,解包可以表示为:sum=df.a + df.b, difference=df.a - df.b

总而言之,如果合并,您将获得以下内容:

df.assign(sum=df.a + df.b, difference=df.a - df.b)

在词典对象前面跟随zip**运算符的提供链接,以更好地了解这些有用工具如何在此特定示例之外工作。