Python中高效统计2秒时间窗口内唯一TN值的方法
优化方案:矢量化分箱统计替代循环
你的循环方案在大数据量下效率极低,核心原因是每次循环都要重复切片DataFrame并计算去重,时间复杂度为O(m*n)(m为循环次数,n为数据量)。以下是两种高效的矢量化实现方法:
方法一:使用pandas cut 分箱 + 分组统计
利用pd.cut将时间值分配到对应的2秒窗口,再通过分组统计每个窗口的唯一TN数量:
import numpy as np import pandas as pd # 定义窗口边界:从5398(5400-2)开始,到86400结束,步长2 bins = np.arange(5400 - 2, 86400 + 1, 2) # 为每条数据标记所属的2秒窗口(左闭右开,匹配你的原始逻辑) rundf['window'] = pd.cut(rundf['time'], bins=bins, right=False) # 分组统计每个窗口的唯一TN数量 uniqueTN_counts = rundf.groupby('window')['TN'].nunique() # 如果需要和原始代码一样的列表格式(仅保留数量值) uniqueTN = uniqueTN_counts.tolist()
方法二:使用numpy digitize 加速分箱
如果数据量特别大,np.digitize比pd.cut速度更快,原理是直接计算每个时间值对应的窗口索引:
import numpy as np import pandas as pd bins = np.arange(5398, 86401, 2) # 获取每条数据所属的窗口索引(right=False对应左闭右开区间) bin_indices = np.digitize(rundf['time'], bins, right=False) # 按窗口索引分组统计唯一TN数量 uniqueTN_counts = rundf.groupby(bin_indices)['TN'].nunique() uniqueTN = uniqueTN_counts.tolist()
关键优化点说明
- 两种方法都是矢量化操作,仅需遍历数据1-2次,时间复杂度降至O(n),远优于循环的O(m*n)
- 避免了循环中重复的DataFrame切片操作,减少了内存开销和计算冗余
- 若你需要保留每个窗口的具体唯一TN值(而非数量),可将
nunique()替换为unique(),但注意大数据下存储所有唯一值会占用较多内存
内容的提问来源于stack exchange,提问作者Jacob Shirley
相关产品推荐
相关产品推荐

