我有一个数据帧,看起来像这样;
created_at value1 value2 value3
2021-04-25 11:38:33 1 1 5
2021-04-25 11:38:47 4 3 6
2021-04-25 11:39:36 1 1 8
2021-04-25 11:39:47 6 5 5
2021-04-25 11:40:50 8 7 3
我试图在2分钟的时间范围内创建具有平均值的组。
我正在使用以下代码;
pd.DataFrame(df.groupby([pd.Grouper(key='created_at', freq='2Min')]).mean())
这是可行的,但目前我正试图添加一个要求,即Grouper在该时间段内至少需要20行才能聚合平均值,但我找不到解决方案。
一行:
df.groupby(
[pd.Grouper(key='created_at', freq='2Min')]
).agg(
lambda x: x.mean() if len(x) > 20 else None # get None if there are not at least 20 rows in the group
).dropna(
how='all', axis=0 # remove all the rows with all na values
)
最简单的解决方案是首先计算mean
,然后使用布尔索引将行数少于20
的组丢弃在聚合帧中。
g = df.groupby(pd.Grouper(key='created_at', freq='2Min'))
avg = g.mean()[g.size() >= 20]
transform
的替代方法,它首先过滤有效组(即至少有20行的组(,然后使用mean
聚合过滤后的组
g = pd.Grouper(key='created_at', freq='2Min')
m = df.groupby(g)['value1'].transform('size').ge(20)
avg = df[m].groupby(g).mean()