gpt4 book ai didi

python - Pandas 在 groupby 中按条件过滤

转载 作者:太空宇宙 更新时间:2023-11-04 09:36:50 24 4
gpt4 key购买 nike

我有一个包含时间和值的矩阵/数据框:

     # time             # Value
M = [[2018-08-08 12:00:00, 5],
[2018-08-08 12:00:00, 7],
[2018-08-08 13:00:00, 2],]

我想按小时分组,然后计算组的平均值,然后修改/减少每个组,使其只有值<=这个平均值。

当前版本:

grouped = M.groupby(pd.Grouper(key='time', freq='1h'))
means = grouped['value'].mean().values # np.array([6, 2])

我卡在这里了。我得到每组的平均值。但我不知道如何减少“分组”,以便条件适用于该组的分组[grouped['value'] <= mean]。

感谢任何建议。


预期输出:

N = [[2018-08-08 12:00:00, 5], # as 5 <= 6 where 6 is the mean of the first group
[2018-08-08 13:00:00, 2]] # as 2 is <= 2 where 2 is the mean of the second group

最佳答案

使用GroupBy.transform对于与原始 DataFrame 大小相同的 Series 由聚合值填充,因此 boolean indexing工作非常好:

M = [['2018-08-08 12:00:00', 5],
['2018-08-08 12:00:00', 7],
['2018-08-08 13:00:00', 2]]

M = pd.DataFrame(M, columns=['time','value'])
M['time'] = pd.to_datetime(M['time'])
print (M)
time value
0 2018-08-08 12:00:00 5
1 2018-08-08 12:00:00 7
2 2018-08-08 13:00:00 2

s = M.groupby(pd.Grouper(key='time', freq='1h'))['value'].transform('mean')
print (s)
0 6
1 6
2 2
Name: value, dtype: int64

mean = 5
df = M[s <= mean]
print (df)
time value
2 2018-08-08 13:00:00 2

编辑:

您还可以按列值进行比较:

df1 = M[M['value'] <= s]
print (df1)
time value
0 2018-08-08 12:00:00 5
2 2018-08-08 13:00:00 2

关于python - Pandas 在 groupby 中按条件过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53359833/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com