首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >熊猫按条件分组过滤

熊猫按条件分组过滤
EN

Stack Overflow用户
提问于 2018-11-18 10:23:03
回答 1查看 113关注 0票数 1

我有一个具有时间和值的矩阵/数据:

代码语言:javascript
运行
复制
     # time             # Value
M = [[2018-08-08 12:00:00, 5],
     [2018-08-08 12:00:00, 7],
     [2018-08-08 13:00:00, 2],]

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

现行版本:

代码语言:javascript
运行
复制
grouped = M.groupby(pd.Grouper(key='time', freq='1h'))
means = grouped['value'].mean().values # np.array([6, 2])

我被卡住了。我得到每一组的平均值。但我不知道如何减少“分组”,以便条件适用于该组的分组[分组‘值’<=意指]。

谢谢你的建议。

预期产出:

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-18 11:09:27

使用GroupBy.transform表示与原始DataFrame大小相同的聚合值填充的Series,因此boolean indexing运行得非常好:

代码语言:javascript
运行
复制
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

编辑:

还可以按列值进行比较:

代码语言:javascript
运行
复制
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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53359833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档