【问题标题】:.apply() a bivariate numpy() lambda function to an .expanding() window of a pandas DataFrame.apply() 将二元 numpy() lambda 函数应用于 pandas DataFrame 的 .expanding() 窗口
【发布时间】:2018-07-26 20:02:11
【问题描述】:

考虑这个简单的代码(loc_fun 中的numpy.sum 是使用 numpy 的更复杂的二元函数的替代):

import pandas
import numpy


def loc_fun(A, B):
    return numpy.sum(A[:-1] > B[-1])


df = pandas.DataFrame(numpy.random.normal(0, 1, [100000, 2]), columns=['size_A', 'size_B']).cumsum(axis=0)
df.expanding(2).apply(lambda x: loc_fun(x.size_A.values, x.size_B.values))

上面代码的最后一行导致我无法理解的错误。 基本上,我想将loc_fun 应用于列中值的expanding() 窗口。

【问题讨论】:

  • 我认为这是个问题,因为还没有实现。 expanding 就像 rolling 分别处理每一列 - 检查 print + (def f(x): print (x) return x.sum() df = df.expanding(2).apply(f))。所以不幸的是需要没有expanding的自定义函数。还要检查this,也许会有所帮助。
  • 不确定,尝试联系作者 - pir 是数学非常聪明的人,希望对您有所帮助;)

标签: python pandas numpy


【解决方案1】:

在 lambda x 中,x 是一个 numpy.ndarray,因此您不能引用列 'A-values' 或 'B_values'。

df.expanding(2).apply(lambda x: print(type(x)))

>><class 'numpy.ndarray'>

【讨论】:

  • 检查我有问题的评论,不幸的是它分别与每一列一起工作:(
  • @Cezary.Sz:你用的是什么版本的熊猫? df.expanding(2).apply(lambda x: print(type(x))) 行本身在此处给出错误 (p0.22)
  • 第二次迭代出错,因为 lambda 得到 NoneType 但 in 必须是实数。
  • 好的,无论如何,jezrael 在 cmets 中的代码可以做到这一点。该死:它会比我想象的更复杂。
猜你喜欢
  • 2016-04-16
  • 2020-02-20
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
  • 2015-01-25
  • 2019-04-10
  • 1970-01-01
  • 2020-07-02
相关资源
最近更新 更多