如何基于两列对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
相关产品推荐
相关产品推荐

