【问题标题】:Dataframe Apply method to return multiple elements (series)Dataframe Apply 方法返回多个元素(系列)
【发布时间】: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' 列接收乘法!

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

【问题讨论】:

标签: python python-2.7 pandas dataframe


【解决方案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 中不起作用,这个答案在 stackoverflow.com/a/36600318/1437877 中起作用
  • 好东西@Abbas,我只是想确保我不会发疯。我在文档中找不到任何地方表明这是 正确的做事方式,然后才能看到他们已经改变了它,所以这一切都不清楚!
【解决方案2】:

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

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)))
      

      【讨论】:

      • 这个问题最优雅的解决方案,谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-16
      • 1970-01-01
      • 2014-06-28
      • 2012-12-17
      • 2019-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多