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

如何在Pandas Series/列中对每行列表内的两数做除法运算

Pandas列中分数字符串转浮点数的高效解决方案

问题回顾

你手头有一个Pandas列,每行是由两个数字组成的列表(从分数拆分而来),示例数据如下:

0    [1, 39]
1    [1, 39]
2    [1, 39]
3    [2, 39]
4    [4, 39]

你的需求是把每行的两个数字相除,得到单个浮点数,但之前用的apply方法不仅效率低下,还返回了全相同的结果,同时列中还存在NaN值需要处理。

错误原因分析

你之前使用的代码:

t.apply(lambda x: float(t[0][0])/float(t[0][1]))

问题出在lambda里引用的是整个Series的第一行数据(t[0]),而不是当前迭代的行x,所以所有行都复用了第一行的1/39结果,导致输出全相同。另外,apply本质是逐行循环,当数据量较大时,效率远低于Pandas的矢量化操作。

高效解决方案

使用Pandas的矢量化字符串操作来处理,不仅速度快,还能自动处理NaN值:

方法一:直接链式操作

df['INTRON'] = df['INTRON'].str.split('/').str[0].astype('float64') / df['INTRON'].str.split('/').str[1].astype('float64')

这个方法的逻辑是:

  • str.split('/'):把每行的分数字符串拆分成包含两个元素的列表
  • str[0]和str[1]:分别提取拆分后的第一个和第二个元素
  • astype('float64'):把字符串转成浮点型
  • 最后执行除法运算,得到每行的浮点数结果

方法二:优化版(减少一次拆分操作)

上面的方法会调用两次str.split,可以用expand=True参数把拆分结果直接展开成两列,只拆分一次,效率更高:

# 拆分并转成浮点型,得到两列临时数据
split_df = df['INTRON'].str.split('/', expand=True).astype('float64')
# 两列相除,赋值回原列
df['INTRON'] = split_df[0] / split_df[1]

这个版本在数据量较大时,性能提升会更明显。

两种方法都能正确处理NaN值:当原列是NaN时,拆分后的结果也是NaN,相除后仍然是NaN,不会抛出异常。

内容的提问来源于stack exchange,提问作者Justin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:18:26