如何用每组最少的行数按时间对pandas数据帧进行分组



我有一个数据帧,看起来像这样;

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()

最新更新