使用Python和pandas创建整数类型新列时报错的问题求助
问题原因
你遇到的问题来自两个非常容易踩的坑:
- 列名拼写不一致:创建新列时你写的列名是
avg_amout(amount拼写漏了字母n),后续做类型转换时操作的是拼写正确的avg_amount列,本质是在操作一个不存在的列,必然会抛错。 - pandas的类型自动转换机制:哪怕你赋值用的全是整数值,只要列表推导式生成的结果里混入了空值、非整数内容,或者旧版pandas里整数列需要存储
NaN(普通int类型不支持存储空值),就会自动把整列类型转为float64或者object类型,不会保留整数类型。
解决方案
写法1:创建列时直接指定整数类型
修正列名拼写后,直接在生成列时指定pandas的可空整数类型Int64(大写I,支持存储空值,不会自动转成float),不需要后续二次转换:
import pandas as pd data['avg_amount'] = pd.array( [ 8000 if x == '$1,000 - $15,000' else 3000000 if x == '$1,000,001 - $5,000,000' else 750000 for x in data['amount'] ], dtype="Int64" )
如果你用的pandas版本较低不支持可空整数类型,先确认列内没有无法转换的异常值,再转成普通int:
# 先排查异常值 print(data["avg_amount"].unique()) # 确认无异常后转换 data["avg_amount"] = data["avg_amount"].astype(int)
写法2:用pandas原生映射替代列表推导式(更稳妥)
多层三元表达式的列表推导式很容易出现隐式的类型问题,用replace做映射可读性更高,也不容易出类型异常:
amount_map = { "$1,000 - $15,000": 8000, "$1,000,001 - $5,000,000": 3000000 } data["avg_amount"] = data["amount"].replace(amount_map).fillna(750000).astype(int)
内容的提问来源于stack exchange,提问作者user2981194
相关产品推荐
相关产品推荐

