Python - 计算从条件之后开始的值的平均值(例如,在另一列中的第一个非零之后)

标签 python pandas

我有一个如下所示的数据框,详细说明了固定日期范围内每种产品的计数。对于某些在日期范围开始之后推出的产品,我想仅在该日期之后计算计数变量的平均值。

例如,“大米”直到 10 月 3 日才会出现,因此大米的平均值仅为 10 月 3 日和 4 日的值,但对于“ bean 类”,平均值为 10 月 1 日至 4 日的平均值。

我使用的 groupby 代码计算了每个产品 4 天的平均值。

如何控制平均值计算在计数的第一个非零值之后开始的日期?

df = pd.DataFrame([['2019-10-01', 'beans', 10],
                   ['2019-10-02', 'beans', 4],
                   ['2019-10-03', 'beans', 5],
                   ['2019-10-04', 'beans', 7],
                   ['2019-10-01', 'rice', 0],
                   ['2019-10-02', 'rice', 0],
                   ['2019-10-03', 'rice', 3],
                   ['2019-10-04', 'rice', 2]],
                  columns=['dt', 'product', 'count'])
df.groupby("product")['count'].describe()['mean']

因此,在这种情况下,“大米”的平均值将为 2.5。

如果我有第 9 行 ['2019-10-05', 'rice', 0],那么这个零计数行将包含在 'rice' 的平均值中,这将则为 1.6666。

最佳答案

这应该可以解决问题:

df["valid"]=df.groupby("product")["count"].cumsum().ne(0)
df.loc[df.valid].groupby("product")["count"].mean()

或者,如果您的计数为负数:

df["valid"]=df["count"].ne(0).groupby(df["product"]).cumsum().ne(0)
df.loc[df.valid].groupby("product")["count"].mean()

输出:

product
beans    6.5
rice     2.5
Name: count, dtype: float64

关于Python - 计算从条件之后开始的值的平均值(例如,在另一列中的第一个非零之后),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59938282/

相关文章:

python - 在python pandas中多次出现相同的分隔符之间提取字符串

python - 在 Pandas 中制作堆叠条形图

python - 从 seaborn clustermap 中提取树状图

python - pandas 中的左连接无需创建左右变量

python - win32file.ReadDirectoryChangesW找不到所有移动的文件

python - xml:从 iterparse 元素获取父属性

python - Celery:如何为基于类的任务创建签名?

python - 将重复数据从行转换为列

python - 在 Pandas 中为组切片设置值的最快方法

python - Pandas 按日期将事件分组在一起,然后测试其他值是否相等