You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于DataFrame所有值生成频率表?现有代码运行报错

解决DataFrame全值频率表生成问题

问题分析

原代码df.apply(pd.Series.value_counts, bins=my_bins)存在两个核心问题:

  • 按列分别统计频率,而非对所有值做整体统计
  • pd.Series.value_counts的bins参数在部分场景下会因区间边界匹配问题报错

解决方案

将DataFrame所有值平铺为一维序列后,统一分箱统计频率,步骤如下:

  1. 提取DataFrame所有值为一维序列,舍弃原索引与列信息
  2. 用自定义区间对数据分箱
  3. 统计各区间频率并整理为标准表格

完整代码示例

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 20:25:20