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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:45:19