如何不使用pandas.Series获取列表的统计量(均值、分位数等)
不用Pandas实现类似describe的统计量计算
可以用Python内置函数、标准库搭配简单自定义逻辑实现这些统计量,完全不需要依赖Pandas:
可用工具
- 内置函数:
len()、min()、max() - 标准库
statistics:提供均值、标准差、中位数的现成计算方法 - 自定义排序+插值逻辑:处理25%、75%分位数(若不想依赖NumPy这类第三方库)
具体实现步骤
假设你有一个数值型列表data(需保证非空且元素均为数值):
- count(数量):直接用
len(data)获取列表元素总数 - mean(均值):调用
statistics.mean(data)计算 - std(标准差):用
statistics.stdev(data)(这是样本标准差,和Pandas默认的ddof=1规则一致;若要计算总体标准差,改用statistics.pstdev(data)) - min(最小值):
min(data)直接返回列表最小值 - max(最大值):
max(data)直接返回列表最大值 - 分位数(25%、50%、75%):
- 50%分位数即中位数,直接用
statistics.median(data)即可 - 25%和75%分位数,纯内置实现可通过排序+线性插值完成:
sorted_data = sorted(data) n = len(sorted_data) # 计算25%分位数 q25_pos = (n - 1) * 0.25 if q25_pos.is_integer(): q25 = sorted_data[int(q25_pos)] else: lower_idx = int(q25_pos) q25 = sorted_data[lower_idx] + (sorted_data[lower_idx+1] - sorted_data[lower_idx]) * (q25_pos - lower_idx) # 计算75%分位数 q75_pos = (n - 1) * 0.75 if q75_pos.is_integer(): q75 = sorted_data[int(q75_pos)] else: lower_idx = int(q75_pos) q75 = sorted_data[lower_idx] + (sorted_data[lower_idx+1] - sorted_data[lower_idx]) * (q75_pos - lower_idx) - 若允许使用NumPy,直接调用
numpy.quantile(data, [0.25, 0.5, 0.75])更简洁,结果和Pandas完全对齐
- 50%分位数即中位数,直接用
完整示例代码
import statistics def describe(data): if not data: raise ValueError("数据列表不能为空") sorted_data = sorted(data) n = len(data) count = n mean = statistics.mean(data) std = statistics.stdev(data) min_val = min(data) max_val = max(data) median = statistics.median(data) # 计算25%分位数 q25_pos = (n - 1) * 0.25 if q25_pos.is_integer(): q25 = sorted_data[int(q25_pos)] else: lower_idx = int(q25_pos) q25 = sorted_data[lower_idx] + (sorted_data[lower_idx+1] - sorted_data[lower_idx]) * (q25_pos - lower_idx) # 计算75%分位数 q75_pos = (n - 1) * 0.75 if q75_pos.is_integer(): q75 = sorted_data[int(q75_pos)] else: lower_idx = int(q75_pos) q75 = sorted_data[lower_idx] + (sorted_data[lower_idx+1] - sorted_data[lower_idx]) * (q75_pos - lower_idx) return { "count": count, "mean": mean, "std": std, "min": min_val, "25%": q25, "50%": median, "75%": q75, "max": max_val } # 测试用例 test_data = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] print(describe(test_data))
这个函数的输出和pandas.Series(test_data).describe()的结果基本一致,仅存在浮点数精度的细微差异。
内容的提问来源于stack exchange,提问作者Droid-Bird
相关产品推荐
相关产品推荐

