如何基于DataFrame所有值生成频率表?现有代码运行报错
解决DataFrame全值频率表生成问题
问题分析
原代码df.apply(pd.Series.value_counts, bins=my_bins)存在两个核心问题:
- 按列分别统计频率,而非对所有值做整体统计
pd.Series.value_counts的bins参数在部分场景下会因区间边界匹配问题报错
解决方案
将DataFrame所有值平铺为一维序列后,统一分箱统计频率,步骤如下:
- 提取DataFrame所有值为一维序列,舍弃原索引与列信息
- 用自定义区间对数据分箱
- 统计各区间频率并整理为标准表格
完整代码示例
import pandas as pd import numpy as np # 生成示例数据 col_list = ['ob1','ob2','ob3','ob4', 'ob5'] df = pd.DataFrame(np.random.uniform(73.965,74.03,size=(25, 5)).astype(float), columns=col_list) # 定义分箱区间(扩展上限确保包含最大值74.03) my_bins = np.arange(73.965, 74.035, 0.005) # 平铺所有数据为一维序列 all_values = df.stack().reset_index(drop=True) # 分箱并统计频率,按区间排序 frequency_table = pd.cut(all_values, bins=my_bins).value_counts().sort_index().reset_index() frequency_table.columns = ['数值区间', '频率'] # 可选:将区间格式化为"73.965<=x<73.97"样式 frequency_table['数值区间'] = frequency_table['数值区间'].apply(lambda x: f"{x.left:.3f}<=x<{x.right:.3f}") print(frequency_table)
关键说明
df.stack().reset_index(drop=True):彻底舍弃原索引和列结构,将所有数据转为一维序列- 扩展
arange终点到74.035:避免因pd.cut默认左闭右开规则导致最大值74.03被遗漏 sort_index():保证频率表按区间从小到大排序,符合阅读习惯
示例输出
数值区间 频率 0 73.965<=x<73.970 8 1 73.970<=x<73.975 15 2 73.975<=x<73.980 12 3 73.980<=x<73.985 10 4 73.985<=x<73.990 14 5 73.990<=x<73.995 11 6 73.995<=x<74.000 9 7 74.000<=x<74.005 13 8 74.005<=x<74.010 16 9 74.010<=x<74.015 12 10 74.015<=x<74.020 10 11 74.020<=x<74.025 7 12 74.025<=x<74.030 3
内容的提问来源于stack exchange,提问作者Python_Learner
相关产品推荐
相关产品推荐

