【问题标题】:Pandas ValueError: Function does not reducePandas ValueError:函数不减少
【发布时间】:2016-05-17 21:58:18
【问题描述】:

我一直在尝试使用 pandas groupby 来分析数据,然后在将 pandas 从版本 0.15.0 更新到 0.18.1 后遇到了一个以前不存在的问题。

我想计算 'equality' 值为 1 的连续周期数(它只能取 0 或 1 的值)。我定义了以下 lambda 函数,并使用 groupby 命令如下:

    import pandas as pd
    E = lambda x: np.sum(x.diff()==1) + x.head(1)

    grouped = df.groupby(['run_'])
    agg_data = grouped[['equality','avg_payoff']].mean()
    agg_data['E'] = grouped.equality.agg(E) # number of "equality" epochs

但是收到了最后一行代码的错误信息:

    ValueError: Function does not reduce

奇怪的是,这段代码在更新之前运行完美。这不是我第一次在更新科学计算包后遇到问题,这让我有点沮丧。有人可以帮忙解决这个问题吗?或者我必须回滚到旧版本...

【问题讨论】:

  • 您介意展示一些您正在使用的数据以便我们进行复制吗?

标签: python pandas dataframe group-by


【解决方案1】:

x.head(1) 返回系列(一行但系列)。 你可以像这样做一个愚蠢的解决方法

E = lambda x: np.sum(x.diff()==1) + np.sum(x.head(1))

或者更聪明一点

E = lambda x: np.sum(x.diff()==1) + x.iloc[0]

【讨论】:

  • 或 x.head().values 保存对外部方法的调用,并且可能针对该操作进行了优化。
  • @Chris x.head().values 比 x.iloc[0] 更有效吗?
  • 嗯,从 NDFrame 的来源,pandas 的父类github.com/pydata/pandas/blob/master/pandas/core/generic.py,.values 返回pandas 使用的内部数组,(df._data)。在这种情况下,差异显然不是必然的,但 iloc 通常会产生更多开销,因为 .values 只是复制您已经操作过的数据。
  • @Chris 我检查了您的解决方案 - x.head().values 的类型为 numpy.ndarray,而不是标量。于是又出现了“例外:必须产生聚合值”。
猜你喜欢
  • 2015-02-10
  • 2019-07-17
  • 1970-01-01
  • 2020-10-09
  • 2021-07-21
  • 1970-01-01
  • 2018-12-01
  • 2014-08-04
  • 1970-01-01
相关资源
最近更新 更多