为何布尔序列调用Pandas的.mean()输出浮点结果?如何关联OVERALL_LI列?
Pandas布尔序列均值计算疑问解答
问题背景
分析以下Pandas代码时遇到两个疑问:
- 执行
education_districtwise['OVERALL_LI'] >= lower_limit得到布尔序列,但最终((education_districtwise['OVERALL_LI'] >= lower_limit) & (education_districtwise['OVERALL_LI'] <= upper_limit)).mean()输出浮点结果,不理解布尔序列调用.mean()为何生成浮点值; - 不清楚最后一行的
.mean()如何关联到OVERALL_LI列,已知代码是筛选该列中处于均值1倍标准差范围内的行,但对均值计算逻辑存疑。
原代码
import pandas as pd education_districtwise = pd.read_csv('education_districtwise.csv') mean_overall_li = education_districtwise['OVERALL_LI'].mean() mean_overall_li std_overall_li = education_districtwise['OVERALL_LI'].std() lower_limit = mean_overall_li - 1 * std_overall_li upper_limit = mean_overall_li + 1 * std_overall_li # 疑问代码 ((education_districtwise['OVERALL_LI'] >= lower_limit) & (education_districtwise['OVERALL_LI'] <= upper_limit)).mean()
示例数据集(education_districtwise.csv)
DISTNAME,STATNAME,BLOCKS,VILLAGES,CLUSTERS,TOTPOPULAT,OVERALL_LI DISTRICT32,STATE1,13,391,104,875564.0,66.92 DISTRICT649,STATE1,18,678,144,1015503.0,66.93 DISTRICT229,STATE1,8,94,65,1269751.0,71.21 DISTRICT259,STATE1,13,523,104,735753.0,57.98 DISTRICT486,STATE1,8,359,64,570060.0,65.0 DISTRICT323,STATE1,12,523,96,1070144.0,64.32 DISTRICT114,STATE1,6,110,49,147104.0,80.48 DISTRICT438,STATE1,7,134,54,143388.0,74.49 DISTRICT610,STATE1,10,388,80,409576.0,65.97
疑问解答
1. 布尔序列调用.mean()生成浮点值的原因
在Pandas的数值计算逻辑中,布尔类型会被自动映射为整数:True对应1,False对应0。对布尔序列调用.mean()时,本质是计算所有元素的算术平均值——也就是符合条件(值为1)的元素数量 ÷ 总元素数量,结果是一个表示比例的浮点数。
比如你的代码中,合并后的布尔序列里,每个True代表该行的OVERALL_LI落在[lower_limit, upper_limit]范围内,False则相反。.mean()最终计算的就是这类符合条件的行占总行数的比例,所以输出浮点结果。
2. .mean()与OVERALL_LI列的关联逻辑
这里的.mean()并没有直接计算OVERALL_LI列的数值均值,而是基于OVERALL_LI生成的布尔序列做统计:
- 先通过两个条件判断,为
OVERALL_LI的每一行生成布尔值,标记该行是否在均值±1倍标准差的范围内; - 用
&将两个布尔序列合并,得到一个完整的"符合条件标记序列"; - 最后调用
.mean(),计算这个标记序列的均值——也就是满足范围要求的行占总行数的比例,而非OVERALL_LI列的数值平均。
举个具体例子:你的示例数据集共9行,假设其中7行的OVERALL_LI落在指定范围内,那么.mean()的结果就是7/9 ≈ 0.7778。
内容的提问来源于stack exchange,提问作者user29742
相关产品推荐
相关产品推荐

