如何用Python对Pandas DataFrame按时间列分箱并计算行计数与序号?
问题需求
我有一些大型文本文件,需转换为Pandas DataFrame后,按time列(单位:秒)以5秒为间隔进行等距分箱。随后需完成以下操作:
- 将
RN列重新定义为每个分箱内的chronological return number(即箱内行的序号,从1开始) - 将
NR列重新定义为每个分箱内的总行数 - 生成
bin列标记分箱编号
简化输入数据集
import pandas as pd df = pd.DataFrame({ 'time': [100, 101, 104, 105, 107, 110, 114, 115, 116, 118], 'RN': [0]*10, 'NOR': [0]*10 })
预期输出
time RN NR bin 0 100 1 3 1 1 101 2 3 1 2 104 3 3 1 3 105 1 2 2 4 107 2 2 2 5 110 1 2 3 6 114 2 2 3 7 115 1 3 4 8 116 2 3 4 9 118 3 3 4
Python实现方案
可以通过Pandas的分组和变换功能轻松实现需求,具体步骤如下:
1. 读取文本文件到DataFrame
如果是CSV格式的文本文件,直接用pd.read_csv读取:
df = pd.read_csv('your_large_file.txt')
2. 生成分箱编号bin列
由于是5秒等距分箱,通过计算每个time对应的分箱基准值,转换为从1开始的编号:
# 计算每个time所属的5秒区间基准值,再转换为从1开始的bin编号 bin_base = df['time'] // 5 df['bin'] = (bin_base - bin_base.min() + 1).astype(int)
解释:time//5会把100-104归为20、105-109归为21,以此类推;减去基准值最小值再加1,让分箱编号从1开始。
3. 计算分箱内的序号RN和总行数NR
按bin分组后,用cumcount()生成组内序号(加1让序号从1开始),用transform('size')获取每个分箱的总行数:
# 生成RN列:组内按原顺序的序号,从1开始 df['RN'] = df.groupby('bin').cumcount() + 1 # 生成NR列:每个分箱的总行数 df['NR'] = df.groupby('bin')['time'].transform('size')
4. 整理最终结果(可选)
保留需要的列并调整顺序:
result_df = df[['time', 'RN', 'NR', 'bin']] print(result_df)
完整代码
import pandas as pd # 读取数据(替换为你的文件路径) df = pd.read_csv('your_large_file.txt') # 生成bin列 bin_base = df['time'] // 5 df['bin'] = (bin_base - bin_base.min() + 1).astype(int) # 计算RN和NR df['RN'] = df.groupby('bin').cumcount() + 1 df['NR'] = df.groupby('bin')['time'].transform('size') # 输出结果 print(df[['time', 'RN', 'NR', 'bin']])
运行上述代码后,即可得到与预期一致的输出。对于大型文件,该方案使用Pandas高效内置方法,不会有性能问题。
内容的提问来源于stack exchange,提问作者katstratt
相关产品推荐
相关产品推荐

