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 方法返回多个元素(系列)的主要内容,如果未能解决你的问题,请参考以下文章