基于DataFrame列值创建新列时apply函数结果异常的问题
问题排查与解决方法
可能的原因
- 数据类型不匹配:你的周数列可能是字符串类型(比如
'30'),但判断逻辑用的是数字30,导致匹配失败,所有值都走else分支返回Osogbo。 - 列表定义错误:如果你的匹配列表不是
[30]而是写错了数字(比如31),或者包含无关值,也会导致30无法被匹配到。 - apply调用问题:可能没正确指定处理的列,或者函数参数传递出错。
解决方法
方法1:修正数据类型后用apply
先统一周数列的类型,再用正确的判断逻辑:
# 转换周数列数据类型为整数(如果原类型是字符串) df['年度周数'] = df['年度周数'].astype(int) # 定义判断函数 def get_strike_location(week): if week == 30: return 'Ilorin' elif week == 32: return 'Osogbo' else: # 其他周数可返回空值或自定义标记,按需调整 return None # 生成新列 df['罢工地点'] = df['年度周数'].apply(get_strike_location)
方法2:用numpy.where矢量化操作(推荐)
不用apply,直接用矢量化运算,速度更快:
import numpy as np # 先确保周数列是整数类型 df['年度周数'] = df['年度周数'].astype(int) df['罢工地点'] = np.where(df['年度周数'] == 30, 'Ilorin', np.where(df['年度周数'] == 32, 'Osogbo', None))
方法3:用字典映射
创建周数与地点的映射关系,直接匹配:
location_map = {30: 'Ilorin', 32: 'Osogbo'} # 转换类型后映射,其他周数返回NaN df['罢工地点'] = df['年度周数'].astype(int).map(location_map)
关键排查步骤
先运行以下代码确认周数列的实际内容和类型:
print(df['年度周数'].unique()) print(df['年度周数'].dtype)
如果输出里出现'30'(带引号的字符串),说明是类型不匹配导致的问题,转成int即可解决。
内容的提问来源于stack exchange,提问作者Amos Moses Omofaiye
相关产品推荐
相关产品推荐

