Pandas DataFrame分组处理:提取子串计算生成baz列的高效方案
高效生成Pandas DataFrame新列baz的解决方案
给定包含foo和bar列的Pandas DataFrame df:
foo bar 0 2410_030_GCD 0.012093 1 2410_030_GCD 0.012789 2 2410_030_GCD 0.014205 3 2410_010_GCD 0.016280 4 2410_010_GCD 0.019738 5 6122_020_LCM 0.025806 6 6122_020_LCM 0.030336 7 6122_020_LCM 0.034753 8 6122_020_LCM 0.042229 9 3456_030_SGD 0.025792 10 3456_030_SGD 0.030255 11 3456_030_SGD 0.034683 12 3456_030_SGD 0.042194
需求:为foo值相同的行组生成新列baz,计算逻辑为:从foo提取前4位数字子串→转为float后除以1000→用bar列值除以该结果,且不能添加其他中间列,需适配大数据量的高效实现。
高效实现代码
df['baz'] = df['bar'] / (df['foo'].str[:4].astype(float) / 1000)
实现说明
- 矢量化操作,性能最优:整个计算过程完全基于Pandas的矢量化API,避免了
groupby逐组循环的开销,处理百万级以上数据时效率远高于循环方案。 - 无中间列,符合要求:直接通过链式计算生成
baz列,不产生任何临时中间列,不会额外占用内存。 - 精准高效提取子串:利用
str[:4]直接截取foo的前4位字符,比正则表达式匹配更高效(已知foo格式固定为前4位数字开头)。
运行后得到的结果与示例一致:
foo bar baz 0 2410_030_GCD 0.012093 0.0050178 1 2410_030_GCD 0.012789 0.0053066 2 2410_030_GCD 0.014205 0.0058942 3 2410_010_GCD 0.016280 0.0067552 4 2410_010_GCD 0.019738 0.0081900 5 6122_020_LCM 0.025806 0.0042153 6 6122_020_LCM 0.030336 0.0049552 7 6122_020_LCM 0.034753 0.0056767 8 6122_020_LCM 0.042229 0.0068979 9 3456_030_SGD 0.025792 0.0074630 10 3456_030_SGD 0.030255 0.0087543 11 3456_030_SGD 0.034683 0.0100356 12 3456_030_SGD 0.042194 0.0122089
内容的提问来源于stack exchange,提问作者DeltaIV
相关产品推荐
相关产品推荐

