如何将DataFrame多列按统一区间分组并生成频次统计表格
问题
现有如下结构的pandas DataFrame:
import pandas as pd df1 = [[5,3,1,9],[0,6,2,3],[1,5,1,8],[5,6,2,8],[2,9,11,3],[0,1,1,17]] df = pd.DataFrame(df1, columns = ['A_june', 'A_july', 'B_june', 'B_july'])
需要将所有列的数据按**0-2、2-4、4-6、6-8、8-10、10+**的统一区间分组,生成以区间为行、各列为列的频次统计表格,格式如下:
Bins A_june A_july B_june B_july 0-2 2-4 4-6 6-8 8-10 10+
尝试使用pd.cut和groupby方法,但未得到预期格式的表格,寻求解决方法。
解决方法
无需使用groupby,直接对每一列应用pd.cut后统计频次,再对齐索引即可实现需求:
- 定义分组区间与标签
先明确分组的分界点和对应显示标签:
bins = [0, 2, 4, 6, 8, 10, float('inf')] labels = ['0-2', '2-4', '4-6', '6-8', '8-10', '10+']
- 批量处理所有列
用apply对每一列执行分组统计,再通过reindex确保所有区间都存在,缺失值填充0:
# 对每列做cut后统计频次,重索引对齐所有区间,填充0 result = df.apply(lambda col: pd.cut(col, bins=bins, labels=labels, include_lowest=True).value_counts()) result = result.reindex(labels).fillna(0).astype(int) # 设置索引名称为Bins result.index.name = 'Bins'
- 查看结果
执行后result即为预期的频次表格,打印输出:
print(result)
输出结果:
A_june A_july B_june B_july Bins 0-2 3 1 4 0 2-4 1 1 2 3 4-6 2 2 0 0 6-8 0 2 0 2 8-10 0 0 0 1 10+ 0 0 0 1
关键说明
include_lowest=True确保左区间包含边界值(比如0会被分到0-2组)reindex(labels)强制按指定的区间顺序排列,避免缺失区间fillna(0).astype(int)把缺失的频次转为整数0,保证格式统一
内容的提问来源于stack exchange,提问作者user13948
相关产品推荐
相关产品推荐

