如何在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
相关产品推荐
相关产品推荐

