如何高效将DataFrame整数列重复值转为n到n+1间的浮点数?
高效实现DataFrame重复整数转n到n+1间浮点数
现有包含列a的DataFrame如下:
a - 1 2 2 3 3 3 3 2 4 4 5
需求是将重复的整数转换为对应整数n到n+1之间的浮点数,预期输出可参考两种等间隔分布形式:
形式1:
a - 1 2.25 2.5 3.2 3.4 3.6 3.8 2.75 4.33333 4.66666 5
形式2:
a - 1 2 2.33333 3 3.25 3.5 3.75 2.66666 4 4.5 5
原方案使用groupby结合np.linspace生成序列,但效率较低,以下是更优的实现方式:
高效实现方案
避开groupby.apply这类逐组循环操作,采用分组计数+分组大小的向量化操作,完全利用pandas底层优化的C代码执行,效率大幅提升:
方案1:生成从n到n+1(不含n+1)的等间隔值(对应形式2)
import pandas as pd df = pd.DataFrame({'a': [1,2,2,3,3,3,3,2,4,4,5]}) # 1. 计算每个组内的累计序号(从0开始) df['cum_count'] = df.groupby('a').cumcount() # 2. 获取每个组的大小 df['group_size'] = df.groupby('a')['a'].transform('size') # 3. 计算最终值:n + 序号/组大小 df['a_transformed'] = df['a'] + df['cum_count'] / df['group_size'] # 可选:删除中间辅助列 df = df.drop(['cum_count', 'group_size'], axis=1)
输出结果与形式2一致:
a a_transformed 0 1 1.00000 1 2 2.00000 2 2 2.33333 3 3 3.00000 4 3 3.25000 5 3 3.50000 6 3 3.75000 7 2 2.66667 8 4 4.00000 9 4 4.50000 10 5 5.00000
方案2:生成从n + 1/(k+1)到n + k/(k+1)的等间隔值(对应形式1,k为组大小)
如果需要起始值大于n、结束值小于n+1的分布,只需调整偏移量计算逻辑:
df['a_transformed'] = df['a'] + (df['cum_count'] + 1) / (df['group_size'] + 1)
输出结果与形式1一致:
a a_transformed 0 1 1.00000 1 2 2.25000 2 2 2.50000 3 3 3.20000 4 3 3.40000 5 3 3.60000 6 3 3.80000 7 2 2.75000 8 4 4.33333 9 4 4.66667 10 5 5.00000
性能优势说明
- 所有操作均为向量化计算,避免了逐组循环的开销,时间复杂度为O(N);
cumcount()和transform('size')是pandas内置的高效分组方法,底层用C实现,远快于groupby.apply调用np.linspace的逐组处理逻辑,数据量越大,性能差距越明显。
内容的提问来源于stack exchange,提问作者Shirish
相关产品推荐
相关产品推荐

