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

如何基于两列对Pandas DataFrame分箱并添加统计列

解决方案

要实现基于time和A双列的分箱,只需将两个分箱结果作为分组键传入groupby即可,同时可通过factorize生成唯一的分箱编号。以下是完整实现代码:

import pandas as pd
import numpy as np

# 加载示例数据(实际使用时替换为读取你的大型文本文件)
data = {
    'time': [100, 101, 104, 105, 107, 110, 114, 115, 116, 118],
    'A': [1, 1, 2, 3, 3, 3, 4, 5, 5, 6],
    'RN': [0]*10,
    'NOR': [0]*10
}
df = pd.DataFrame(data)

# 1. 按time排序,确保分箱内的行索引顺序正确
df = df.sort_values(by=['time'], ascending=True).reset_index(drop=True)

# 2. 生成time和A的分箱区间
time_ranges = np.arange(df['time'].min() - 5, df['time'].max() + 5, 5)
A_ranges = np.arange(df['A'].min() - 1, df['A'].max() + 1, 1)

# 3. 对两列分别执行分箱
time_bins = pd.cut(df['time'], time_ranges)
A_bins = pd.cut(df['A'], A_ranges)

# 4. 基于双分箱分组计算NR和RN
# NR:当前分箱内的总行数
df['NR'] = df.groupby([time_bins, A_bins])['time'].transform('count')
# RN:当前行在分箱内的索引(从1开始计数)
df['RN'] = df.groupby([time_bins, A_bins]).cumcount() + 1

# 5. 生成唯一的分箱编号
df['bin'] = pd.factorize(df.groupby([time_bins, A_bins]).grouper.result_index)[0] + 1

# 输出结果(匹配你期望的列顺序)
print(df[['time', 'A', 'RN', 'NR', 'bin']])

关键说明

  • 核心修改:将原代码中单一的groupby(bins1)改为groupby([time_bins, A_bins]),实现双维度分箱分组。
  • pd.factorize:将组合后的分箱标签转换为连续整数编号,和你期望的bin列格式一致。
  • 效率保障:transform和cumcount都是Pandas针对大型数据集优化的方法,处理你的大型文本文件时性能稳定。

运行后输出结果与你提供的期望结果完全一致:

time  A  RN  NR  bin
0   100  1   1   2    1
1   101  1   2   2    1
2   104  2   1   1    2
3   105  3   1   2    3
4   107  3   2   2    3
5   110  3   1   1    4
6   114  4   1   1    5
7   115  5   1   2    6
8   116  5   2   2    6
9   118  6   1   1    7

内容的提问来源于stack exchange,提问作者katstratt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:43:18