Dataframe Apply 方法返回多个元素(系列)

Posted

技术标签:

【中文标题】Dataframe Apply 方法返回多个元素(系列)【英文标题】:Dataframe Apply method to return multiple elements (series) 【发布时间】:2016-08-04 15:01:03 【问题描述】:
import pandas as pd

假设我有一个像这样的dataframe

df = pd.DataFrame("a":range(4),"b":range(1,5))

看起来像这样:

   a  b
0  0  1
1  1  2
2  2  3
3  3  4

还有一个将 X 乘以 Y 的函数:

def XtimesY(x,y):
    return x*y

如果我想向 df 添加一个新的熊猫系列,我可以这样做:

df["c"] =df.apply( lambda x:XtimesY(x["a"],2), axis =1)

有效!

现在我想添加多个系列:

我有这个功能:

def divideAndMultiply(x,y):
    return x/y, x*y

类似的东西?:

df["e"], df["f"] = df.apply( lambda x: divideAndMultiply(x["a"],2) , axis =1)

它不起作用!

我希望'e' 列接收除法,'f' 列接收乘法!

注意:这不是我使用的代码,但我期待相同的行为。

【问题讨论】:

Apply pandas function to column to create multiple new columns?的可能重复 【参考方案1】:

更新

更新至 0.23 版 - 使用 result_type='broadcast' 了解更多详情,请参阅 documentation

像这样重新定义你的函数:

def divideAndMultiply(x,y):
    return [x/y, x*y]

然后这样做:

df[['e','f']] = df.apply(lambda x: divideAndMultiply(x["a"], 2), axis=1, result_type='broadcast')

你会得到想要的结果:

In [118]: df
Out[118]:
   a  b  e  f
0  0  1  0  0
1  1  2  0  2
2  2  3  1  4
3  3  4  1  6

【讨论】:

我已经多次看到这个答案,但任何时候我尝试过,我都会得到KeyError: "['e', 'f'] not in index。我认为 pandas 一定已经改变了,它仍然对你有用吗@Abbas? 它仍然有效。按照问题和答案重现结果。 repl.it/@seaders/SuperbIncompatibleAudacity 不是,不是在 Python 3.6 和 pandas 0.23.1 - KeyError @seaders 你是对的,这个答案在 0.23.1 中不起作用,这个答案在 ***.com/a/36600318/1437877 中起作用 好东西@Abbas,我只是想确保我不会发疯。我在文档中找不到任何地方表明这是 正确的做事方式,然后才能看到他们已经改变了它,所以这一切都不清楚!【参考方案2】:

这个令人沮丧的问题的以下解决方案对我有用。不久前,我在另一篇 *** 帖子中找到了最初的建议。诀窍是将返回值包装成这样的系列:

def divideAndMultiply(x,y):
    return pd.Series([x/y, x*y])

那么这就是你想要的:

df[['e','f']] = df.apply( lambda x: divideAndMultiply(x["a"],2) , axis =1)

【讨论】:

【参考方案3】:
df["e"], df["f"] = zip(*df.apply( lambda x: divideAndMultiply(x["a"],2) , axis =1))

应该做的伎俩。

(我展示了这个示例,以便您了解如何使用多个列作为输入来创建多个新列)

【讨论】:

【参考方案4】:

差不多了。使用 zip* 解压函数。试试这个:

def divideAndMultiply(x,y):
    return x/y, x*y

df["e"], df["f"] = zip(*df.a.apply(lambda val: divideAndMultiply(val,2)))

【讨论】:

这个问题最优雅的解决方案,谢谢!

以上是关于Dataframe Apply 方法返回多个元素(系列)的主要内容,如果未能解决你的问题,请参考以下文章

pandas DataFrame apply()函数

pandas DataFrame apply()函数

表格视觉样式:Dataframe.style (转)

pandas 的DataFrame.apply()

使用 pandas groupby + apply 和 condensing groups 计算平均值的更快方法

获取映射值的余弦距离的有效(不是 DataFrame.apply)方法