【问题标题】:Calculate column average row by row using pandas使用熊猫逐行计算列平均值
【发布时间】:2022-11-14 13:23:31
【问题描述】:

我有以下熊猫 DF:

    val
1   10
2   20
3   30
4   40
5   30

我想得到两个输出列:平均和avg_sep

平均应该是逐行计算的平均值。

avg_sep应该是逐行计算的平均值,直到某个条件(即直到第 3 行我计算一个平均值,在第 3 行我开始计算另一个平均值之前),我的预期输出是:

    val  avg  avg_sep
1   10   10   10
2   20   15   15
3   30   20   20
4   40   25   40
5   30   26   35

我知道我可以使用df.mean(axis=0) 来获取列的平均值。但是我怎样才能得到预期的输出呢?

【问题讨论】:

  • 您可以使用df["avg"] = df["val"].cumsum() / df.index 来计算avg。我不确定你对avg_sep 的意思。
  • avg_sep 只是一个名字。基本上我想计算给定行的平均值,然后仅考虑以下行再次开始计算平均值。
  • 嗯,也许您可​​以使用与avg 列相同的结构分段构建它?我认为:df.loc[:3, "avg_sep"] = df.loc[:3, "val"].cumsum() / np.arange(1, 4) 和 df.loc[4:, "avg_sep"] = df.loc[4:, "val"].cumsum() / np.arange(1, 3) 会起作用,但可能会有更好/更优雅的选择
  • 谢谢!您介意将其发布为答案吗?所以我可以接受!

标签: python pandas


【解决方案1】:

从 cmets 的讨论中:

import pandas as pd
import numpy as np

# Building frame:
df = pd.DataFrame(
    data={"val": [10, 20, 30, 40, 30]},
    index=[1, 2, 3, 4, 5]
)

# Solution:
df["avg"] = df["val"].cumsum() / np.arange(1, 6) # or `/ df.index`
df.loc[:3, "avg_sep"] = df.loc[:3, "val"].cumsum() / np.arange(1, 4)
df.loc[4:, "avg_sep"] = df.loc[4:, "val"].cumsum() / np.arange(1, 3)

【讨论】:

    【解决方案2】:

    将expanding 与mean() 一起使用:

    df = pd.DataFrame(data=[[10],[20],[30],[40],[30]], columns=["val"])
    
    df["avg"] = df["val"].expanding().mean()
    
    split_at = 3
    df["sep_flag"] = pd.concat([df["val"][:split_at,].expanding().mean(), df["val"][split_at:,].expanding().mean()])
    
    [Out]:
       val   avg  sep_flag
    0   10  10.0      10.0
    1   20  15.0      15.0
    2   30  20.0      20.0
    3   40  25.0      40.0
    4   30  26.0      35.0
    

    【讨论】:

      猜你喜欢
      • 2021-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-30
      • 2018-06-23
      • 2019-12-23
      • 2019-06-13
      相关资源
      最近更新 更多