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

如何高效将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 15:01:01