首页 > 解决方案 > 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

标签: pythondataframe

解决方案


问题是 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 或实现可能会在没有警告的情况下更改。


推荐阅读