使用dplyr按条件分组汇总过滤,统计分组分位数上下观测数
批量统计分组数据在全量分位数上下的观测数
给你一套基于Pandas的批量处理方案,直接复用就能解决你的需求,步骤如下:
1. 构造示例数据(模拟你的foo数据集)
import pandas as pd import numpy as np np.random.seed(42) foo = pd.DataFrame({ 'Group': np.repeat(['A', 'B', 'C'], 100), 'Time': np.tile(np.arange(1, 101), 3), 'Value': np.random.normal(50, 10, 300) })
2. 计算全数据集的目标分位数
先基于整个数据集算出10th、50th、90th分位数,作为后续统计的基准:
# 计算分位数并命名,方便后续引用 quantiles = foo['Value'].quantile([0.1, 0.5, 0.9]).round(2) quantiles.index = ['10th', '50th', '90th']
3. 筛选指定时间段的数据
把Time>25替换成你实际需要的Time>250即可:
filtered_data = foo[foo['Time'] > 25].reset_index(drop=True)
4. 批量处理所有分组与分位数
用groupby+apply自动遍历每个分组,统计每个分位数上下的观测数量:
# 定义统计函数,对单个分组计算所有分位数的上下计数 def count_quantile_stats(group): stats = {} for q_name, q_val in quantiles.items(): stats[f'Below_{q_name}'] = (group['Value'] < q_val).sum() stats[f'Above_{q_name}'] = (group['Value'] > q_val).sum() # 要是需要统计等于分位数的情况,加这行: # stats[f'Equal_{q_name}'] = (group['Value'] == q_val).sum() return pd.Series(stats) # 批量应用到所有分组 result = filtered_data.groupby('Group').apply(count_quantile_stats).reset_index()
输出结果示例
运行后你会得到一个清晰的统计表,每个分组对应所有分位数的上下观测数:
Group Below_10th Above_10th Below_50th Above_50th Below_90th Above_90th 0 A 7 68 37 38 1 74 1 B 6 69 39 36 0 75 2 C 7 68 35 40 2 73
补充说明
- 分位数完全基于全数据集计算,不是分组内的分位数,符合你的需求。
- 不管你有多少个分组,这段代码都会自动遍历处理,不需要手动逐个指定分组。
- 要是需要调整分位数的种类(比如加25th、75th),只需要修改
quantile()里的参数列表即可。
内容的提问来源于stack exchange,提问作者user111024
相关产品推荐
相关产品推荐

