首页 文章

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

提问于
浏览
2

我想将一个具有多个返回的函数应用于 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)

目标是在 ab 上调用 add_subtract 的单个命令在 df 中创建两个新列: sumdifference .

我觉得这样的事情可能有用:

(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 回答

  • 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

    一种方法是使用 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个元组包含来自每个参数序列或迭代的第i个元素 . 例如, 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** 运算符,以更好地了解这些有用的工具如何工作超出此特定示例 .

相关问题