Pandas使用.map()替换iPhone机型电池值报错的解决咨询
iPhone机型电池值替换问题解决
问题背景
定义了iPhone机型与电池容量的映射字典:
iphone_dict = { "iPhone 14 Pro Max": 4323, "iPhone 14 Plus": 4325, "iPhone 14 Pro": 3200, "iPhone 14": 3279, "iPhone 13 Pro Max": 3095, "iPhone 13 Pro": 3095, "iPhone 13": 3095, "iPhone 13 mini": 2406, "iPhone 12 Pro Max": 2815, "iPhone 12 Pro": 2815, "iPhone 12": 2815, "iPhone 12 mini": 2406, "iPhone SE (2022)": 2018, "iPhone SE (2020)": 1821, "iPhone 11 Pro Max": 3969, "iPhone 11 Pro": 3046, "iPhone 11": 3110, "iPhone XS Max": 3174, "iPhone XS": 2658, "iPhone XR": 2716, "iPhone X": 2716, "iPhone 8 Plus": 2691 }
需求:当DataFrame的CleanedPhoneName列包含“iPhone”时,用上述字典替换Battery列的值。
尝试的代码:
dfClean2['Battery'] = dfClean2[dfClean2['CleanedPhoneName'].str.contains('iPhone', case=False)].map(iphone_dict)
运行后报错:'DataFrame' object has no attribute 'map'
错误原因
dfClean2[dfClean2['CleanedPhoneName'].str.contains(...)]返回的是整个DataFrame,而map()是Pandas Series的专属方法,DataFrame没有这个属性,因此报错。
解决方法
方法一:精准定位替换(推荐)
用loc定位需要修改的行和列,针对CleanedPhoneName列做映射后赋值:
# 仅对包含iPhone的行,将CleanedPhoneName匹配字典后的值赋值给Battery列 dfClean2.loc[dfClean2['CleanedPhoneName'].str.contains('iPhone', case=False), 'Battery'] = dfClean2['CleanedPhoneName'].map(iphone_dict)
方法二:保留非iPhone行原电池值
如果希望非iPhone机型的Battery值保持不变,用mask()方法实现条件替换:
# 生成所有机型的电池映射值 battery_mapped = dfClean2['CleanedPhoneName'].map(iphone_dict) # 仅替换iPhone行的Battery值,其他行保留原值 dfClean2['Battery'] = dfClean2['Battery'].mask(dfClean2['CleanedPhoneName'].str.contains('iPhone', case=False), battery_mapped)
补充处理:避免不匹配机型出现NaN
如果CleanedPhoneName中存在字典未覆盖的iPhone机型,映射会得到NaN,可以用fillna()保留原电池值:
dfClean2.loc[dfClean2['CleanedPhoneName'].str.contains('iPhone', case=False), 'Battery'] = dfClean2['CleanedPhoneName'].map(iphone_dict).fillna(dfClean2['Battery'])
内容的提问来源于stack exchange,提问作者Austin Kwak
相关产品推荐
相关产品推荐

