我有一个如下所示的数据框,详细说明了固定日期范围内每种产品的计数。对于某些在日期范围开始之后推出的产品,我想仅在该日期之后计算计数变量的平均值。
例如,“大米”直到 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/