如何用pandas从两个DataFrame按指定数值区间统计行数并构建汇总表
O18字段区间统计实现方案
核心问题修正
你原有代码存在两个问题:
- 将浮点型的O18字段和字符串
'-20'做等值判断,无法匹配到数值类型的目标行 - 仅使用等值判断无法覆盖区间范围的筛选需求,需要组合上下边界的大小判断逻辑实现区间筛选
完整实现代码
用pandas内置的pd.cut分箱方法实现批量区间统计,效率更高且不会出现边界遗漏:
import pandas as pd import scipy.stats as scs from Extract_elevation import * # 读取新旧数据集 df_old = dfle df_new = dfne # 定义统计区间边界、区间展示名称 bin_edges = [-20, -15, -5, 5] interval_names = ['-20~-15', '-15~-5', '-5~5'] # 分箱统计各区间行数,reindex保证区间顺序和定义一致 old_stat = pd.cut( df_old['O18ad'], bins=bin_edges, labels=interval_names, include_lowest=True # 包含最小边界值-20,避免漏统计 ).value_counts().reindex(interval_names) new_stat = pd.cut( df_new['O18nd'], bins=bin_edges, labels=interval_names, include_lowest=True ).value_counts().reindex(interval_names) # 构建结构化汇总表 summary_df = pd.DataFrame({ 'old': old_stat, 'new': new_stat })
关键逻辑说明
- 如果你需要手动写单区间筛选逻辑,多条件判断必须给每个条件加圆括号,用
&表示逻辑与、|表示逻辑或,不能直接用Python原生的and/or,示例:# 统计旧数据中O18ad落在-20~-15区间(包含-20、不包含-15)的行数 count_1 = df_old.loc[(df_old['O18ad'] >= -20) & (df_old['O18ad'] < -15), 'O18ad'].count() - 区间边界规则可以根据需求调整:如果需要包含区间右边界,把判断条件里的
<改成<=即可,pd.cut默认是左开右闭规则,加include_lowest=True后第一个区间为全闭区间。 - 最终输出的
summary_df行索引为三个区间名,列分别为旧数据集、新数据集的对应行数,和你需要的汇总结构完全匹配。
内容的提问来源于stack exchange,提问作者Weiss
相关产品推荐
相关产品推荐

