如何将预定义带频数的区间加载到Pandas并生成类value_counts输出?
解决方案:从预定义区间和频数生成Pandas频数表
步骤1:加载原始区间数据
首先将教材中的区间和频数数据加载到Pandas DataFrame中:
import pandas as pd import numpy as np # 输入教材提供的区间与频数 data = { 'Bin': ['105-109', '110-114', '115-119', '120-124', '125-129', '130-134'], 'Frequency': [2, 5, 6, 8, 8, 1] } df = pd.DataFrame(data)
步骤2:转换区间为Pandas Interval类型
为了匹配pd.Series.value_counts(bins=...)的输出格式(左开右闭区间),需要将字符串格式的区间转换为Pandas的Interval对象:
# 解析区间字符串,生成左开右闭的Interval(匹配pd.cut默认格式) def parse_bin_to_interval(bin_str): left, right = map(int, bin_str.split('-')) # 给左边界减极小值,确保原始闭区间的左端点被包含在左开右闭的区间内 return pd.Interval(left - 1e-9, right, closed='right') # 生成Interval列 df['Interval'] = df['Bin'].apply(parse_bin_to_interval)
步骤3:生成与value_counts一致的频数Series
将Interval设为索引,提取频数列即可得到目标格式的输出:
# 转换为Series并按区间排序 freq_series = df.set_index('Interval')['Frequency'].sort_index() # 打印结果 print(freq_series)
输出结果
(104.999, 109.0] 2 (109.999, 114.0] 5 (114.999, 119.0] 6 (119.999, 124.0] 8 (124.999, 129.0] 8 (129.999, 134.0] 1 dtype: int64
关键说明
- 调整左边界的原因:
pd.cut默认使用左开右闭区间(closed='right'),而教材中的区间是闭区间,给左边界减去极小值(如1e-9)可以保证原始区间的左端点被正确包含,同时格式与value_counts输出完全一致。 - 如果需要保留闭区间格式,可以将
closed参数改为'both',但输出的区间会显示为[105, 109],与value_counts的默认格式不同。
内容的提问来源于stack exchange,提问作者Jimmy3421
相关产品推荐
相关产品推荐

