python - Python 数据框 - .astype(str).astype(int) 给出错误 ValueError: invalid literal for int() with base 10: ''
问题描述
我正在尝试使用以下方法将数据框列从 object 转换为 int:
df['col'].astype(str).astype(int)
但我收到一个错误
ValueError: invalid literal for int() with base 10: ''
因为有些元素是空的。我该如何处理并克服/摆脱这个错误?
这是我的专栏的一部分:
0001081316
0001081316
0001609253
0000928022
0000928022
0000916457
0000916457
0000916457
0000916457
0000016732
0001094093
0000911177
0000816284
0000816284
0000879573
0000018808
0000785080
0000018926
0000018926
0000018926
0000018926
0001319048
0001627223
0000895126
0000895126
0000895126
0000895126
0000895126
0000716133
0000716133
0000716133
0000716133
0000716133
0000020520
0000020520
0000020520
0000020520
0001400891
0001400891
0001400891
0000020947
0000764065
0000764065
0000764065
0000764065
0000764065
0000021344
0000021344
0000215466
0000215466
0001158324
0001323653
0001166691
0001166691
0001166691
0001166691
0001166691
0001166691
0001166691
0000918040
0000023194
0000023217
0001358071
0001163165
0001163165
0001710366
0000897732
0000016918
0000016918
0000732834
0000732834
0000024741
0001018980
0000025305
0000025305
0001051470
0001051470
0000912513
0000028630
0000916540
0000931336
0001571996
0000027904
0000027996
0001090012
0001090012
0001090012
0001090012
0000949039
0000949039
0000949039
0000715957
0000715957
0000029669
0000029669
0000029669
0000029669
0000029669
0000029669
0000029669
0000029669
0000030554
0000030554
0000030554
0000030554
0001326160
0001326160
0001092839
0000821189
0000821189
0000821189
0000821189
0000821189
0000821189
0000750199
0000033213
0000033213
0000915389
0001600470
0001066107
0001066107
0001590895
0000032604
0000032604
0001591763
0001591763
0000880285
0000880285
0000880285
0001161154
0001161154
0001161154
0001024401
0001024401
0000033619
0001532063
0001532063
0001532063
0000887936
0001062613
0000880430
0000880430
0000038074
0000038074
0000831259
0000831259
0000831259
0000831259
解决方案
问题是 int 列存储在 int32 或 int64 numpy 数组中,并且 dtype 都没有空值的概念。如果向 int 列添加 NaN 值后立即将其转换为浮点类型,这并非偶然。
对于最新版本的 Pandas >=0.24,您可以尝试使用可为空的整数扩展 dtype:
df['A'] = pd.Series(np.where(df['A'].isna()|(df['A']==''), pd.NA,
df.loc[df['A']!='','A'].apply(int).reindex(df.index)
.fillna(0)), dtype=pd.Int64Dtype)
但要注意 is 被明确声明为实验性的:
笔记
IntegerArray 目前是实验性的。它的 API 或实现可能会在没有警告的情况下更改。
推荐阅读
- javascript - 如何在不重新加载页面的情况下更改 BrowserWindow 哈希 url
- javascript - clearInterval 不会停止间隔
- c++ - 使用 Detected Idiom 实现 is_destructible
- r - 无法为签名“逻辑”找到函数“rowData”的继承方法
- c# - 为什么我的 Windows 窗体按钮上缺少 Aero 视觉样式动画?
- php - 如何将 do-while 循环转换为 for 循环
- python - ImportError:无法导入名称“convert_kernel”
- exception - 如何在 .NET CORE 中使用 SqlException?
- amazon-web-services - 在 S3 中,通过具有不同访问级别的 IAM 策略将文件夹分配给两个用户
- haskell - Haskell QuickCheck 用于测试 n-ary tree eval