Python中为何输出<map object at...>?Pandas处理CSV遇此问题求助
解决Pandas中map返回对象而非实际值的问题
嘿,我刚学Pandas的时候也踩过这个坑!你看到的<map object at ...>是因为在Python 3里,map()函数返回的是一个迭代器对象,而不是直接生成列表——Pandas没法把这个迭代器直接解析成DataFrame的列值,所以就显示了对象的内存地址。
下面给你几种简单的修复方案,按需选择就行:
方案1:把map对象转为列表
最简单的修复方式就是用list()把map迭代器转换成Pandas能识别的列表,直接修改你原代码的最后一行:
csv_file = pd.read_csv("C:\\location-of-csv\\sample-csv.csv") def update_measure(data): return data.split('_', 1)[1] # 把map结果转为列表 csv_file['UpdatedMeasurement'] = list(map(update_measure, csv_file['Measurement'])) print(csv_file.head())
方案2:使用Pandas的apply()方法(更推荐)
其实Pandas本身就有专门处理Series元素级操作的方法——apply(),它会自动遍历每个元素并应用你的函数,比map+list更符合Pandas的使用习惯,代码也更易读:
csv_file = pd.read_csv("C:\\location-of-csv\\sample-csv.csv") def update_measure(data): return data.split('_', 1)[1] # 用apply替代map csv_file['UpdatedMeasurement'] = csv_file['Measurement'].apply(update_measure) print(csv_file.head())
方案3:用Pandas字符串方法(最高效)
如果你的操作只是字符串分割,完全不需要自定义函数,直接用Pandas内置的str.split()方法,速度更快,代码也更简洁:
csv_file = pd.read_csv("C:\\location-of-csv\\sample-csv.csv") # 直接用str.split分割,取第二个部分 csv_file['UpdatedMeasurement'] = csv_file['Measurement'].str.split('_', n=1).str[1] print(csv_file.head())
这里的n=1表示只分割一次,和你自定义函数里的split('_',1)效果一致,str[1]就是取分割后的第二个元素。
不管用哪种方法,运行后你再打印csv_file.head(),就能看到UpdatedMeasurement列显示的是你想要的分割后的值,而不是map对象啦!
内容的提问来源于stack exchange,提问作者Indrajeet Gour
相关产品推荐
相关产品推荐

