Pandas多列元素映射打标及原地修改实现问题咨询
问题排查
- 变量名错误:读取csv生成的变量是
df,但筛选列时用了data.columns,运行会直接抛出NameError - 自定义函数无返回值:
get_label中调用ser.map后没有返回处理后的Series,apply最终拿到的结果全是None - 未对原DataFrame赋值:
df[columns].apply()会返回全新的DataFrame对象,没有赋值回原对象的话完全不会修改原df的数据
正确实现方案
方案1:基于原有逻辑修正
保留你原本的apply+map写法,仅修复存在的问题:
import pandas as pd df = pd.read_csv('data/extrusion.csv') # 修正变量名错误,用df.columns而非data.columns columns = [c for c in df.columns if 'SDickeIst'.lower() in c.lower()] # 定义基于值返回对应分类的函数,补充返回值 def get_label(ser): return ser.map(lambda x : x if x == 0 else 1) # 将处理后的结果赋值回原列,实现修改 df[columns] = df[columns].apply(get_label)
方案2:更高效的向量化实现
推荐使用该方案,Pandas底层直接做批量运算,性能比逐元素遍历的map/apply高1~2个数量级,适合数据量较大的场景
import pandas as pd df = pd.read_csv('data/extrusion.csv') columns = [c for c in df.columns if 'SDickeIst'.lower() in c.lower()] # where逻辑:满足==0的条件保留原值,不满足的统一替换为1,完全匹配需求 df[columns] = df[columns].where(df[columns] == 0, 1)
内容的提问来源于stack exchange,提问作者Alexandru Antochi
相关产品推荐
相关产品推荐

