Pandas自定义函数映射列值异常:新列仅返回0.131问题排查
问题原因及解决方法
原因分析
你调用construct(merged_df['Tower'])时,传入的是整个Pandas Series(即'Tower'列的所有数据),而非逐行的单个元素。函数内部的for i in x会遍历这个Series的元素,一旦遇到第一个匹配"Orion"的元素,函数就直接返回0.131并终止执行。最后将这个单一值赋值给新列时,Pandas会自动把该值广播到整个列,导致所有行都显示0.131。
正确实现方式
方式1:用apply逐元素处理
修改函数调用逻辑,让construct函数接收单个元素而非整个Series:
def construct(tower_name): if tower_name == "Orion": return 0.131 elif tower_name == "Omega": return 0.148 elif tower_name == "Oyster": return 0.106 elif tower_name == "Skyraa": return 0 # 可选:添加未匹配值的默认返回 return None merged_df['Tower construct %'] = merged_df['Tower'].apply(construct)
方式2:用map配合字典(更高效)
Pandas推荐使用字典映射的方式完成这类值转换,性能比apply更好:
tower_mapping = { "Orion": 0.131, "Omega": 0.148, "Oyster": 0.106, "Skyraa": 0 } merged_df['Tower construct %'] = merged_df['Tower'].map(tower_mapping) # 若需处理未匹配的Tower名称,可添加fillna: # merged_df['Tower construct %'] = merged_df['Tower'].map(tower_mapping).fillna(0) # 或其他默认值
内容的提问来源于stack exchange,提问作者Nishant Padhee
相关产品推荐
相关产品推荐

