GeoDataFrame列条件减1操作异常:apply返回非预期结果求助
问题原因及解决办法
问题根源
你代码里的核心错误是:在apply的lambda函数中使用了df['old_column'].subtract(1),这是对整个old_column列执行减1操作,而非针对当前行的单个值。当条件y['old_column'] > 0满足时,你把整个列的计算结果(一个Series对象)赋值给了当前行的new_column,最终pandas会把这个Series转换成字符串形式存储,所以你看到了类似"3-2"的异常输出——这其实是Series元素的拼接展示,不是单个值的正确计算结果。
修复方案
有几种更合理的写法,推荐优先使用不需要逐行循环的方法(效率更高):
1. 修正apply的写法(针对单行值操作)
把对整列的操作改成对当前行值的减1:
df['new_column'] = df.apply(lambda y: y['old_column'] - 1 if y['old_column'] > 0 else y['old_column'], axis=1)
2. 更高效的向量化操作(推荐)
避免使用apply逐行循环,用pandas/numpy的向量化方法:
- 方法一:numpy where
import numpy as np df['new_column'] = np.where(df['old_column'] > 0, df['old_column'] - 1, df['old_column'])
- 方法二:pandas mask
df['new_column'] = df['old_column'].mask(df['old_column'] > 0, df['old_column'] - 1)
- 方法三:pandas loc切片
df['new_column'] = df['old_column'].copy() df.loc[df['old_column'] > 0, 'new_column'] -= 1
内容的提问来源于stack exchange,提问作者OgeiD
相关产品推荐
相关产品推荐

