【问题标题】:Pandas run function only on subset of whole DataframePandas 仅在整个 Dataframe 的子集上运行功能
【发布时间】:2021-07-23 09:42:49
【问题描述】:

假设我有 Dataframe,它有 200 个值和产品价格。我想在这个数据框上运行一些操作,比如计算最近 10 个价格的平均价格。 我理解它的方式,现在熊猫将遍历每一行并计算每一行的平均值。即前 9 行是 Nan,然后从 10 到 200,它将计算每行的平均值。

我的问题是我需要做很多这些计算并且性能是一个问题。出于这个原因,我只想对所有值的最后 10 个值(不需要更多)运行平均值,而我想将这些值保留在数据框中。即我不想摆脱这些值或创建新的数据框。 我只是想在更少的数据上进行计算,所以它更快。

这样的事情可能吗?希望问题很清楚。

【问题讨论】:

  • 请与预期值共享示例数据框(不是 200 行,您可以共享 10 行)。数据不是图片
  • 选择最后 10 行 df.iloc[-10:] 并将函数应用于它们有什么问题?

标签: pandas dataframe


【解决方案1】:

Chicodelarose's answer 的基础上,您可以使用更“pandas-like”的语法来实现这一点。

定义你的df如下,我们得到200个价格在[0, 1000)以内。

df = pd.DataFrame((np.random.rand(200) * 1000.).round(decimals=2), columns=["price"])

不过,您正在寻找的部分是:

def add10(n: float) -> float:
    """An exceptionally simple function to demonstrate you can set 
    values, too.
    """
    return n + 10

df["price"].iloc[-12:] = df["price"].iloc[-12:].apply(add10)

当然,您也可以使用这些选择来返回其他内容而无需设置值。

>>> df["price"].iloc[-12:].mean().round(decimals=2)
309.63  # this will, of course, be different as we're using random numbers

这种方法的主要理由在于使用pandas 工具。假设您要对具有多列的数据子集进行操作,您只需调整 .apply(...) 以包含 axis 参数,如下所示:.apply(fn, axis=1)

您在pandas 中花费的时间越长,它的可读性就越高。 ?

【讨论】:

    【解决方案2】:

    给定如下数据框:

          Price
    0    197.45
    1     59.30
    2    131.63
    3    127.22
    4     35.22
    ..      ...
    195   73.05
    196   47.73
    197  107.58
    198  162.31
    199  195.02
    
    [200 rows x 1 columns]
    

    调用以下命令获取数据帧最后 n 行的平均值:

    def mean_over_n_last_rows(df, n, colname):
        return df.iloc[-n:][colname].mean().round(decimals=2)
    
    print(mean_over_n_last_rows(df, 2, "Price"))
    

    输出:

    178.67
    

    【讨论】:

      猜你喜欢
      • 2013-11-09
      • 2014-08-08
      • 2020-01-15
      • 1970-01-01
      • 2021-12-07
      • 2021-09-05
      • 1970-01-01
      • 2019-02-05
      • 2016-09-13
      相关资源
      最近更新 更多