Python dataframe - .astype (str) .astype (int) выдает ошибку ValueError: недопустимый литерал для int () с базой 10: '' - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь преобразовать столбец dataframe из объекта в 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

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Проблема в том, что столбцы 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)

Но будьте осторожны, это явно объявлено экспериментальным:

Примечание

IntegerArray в настоящее время является экспериментальным. Его API или реализация могут быть изменены без предупреждения.

0 голосов
/ 29 мая 2020

в первую очередь заполнить пустые элементы, а затем преобразовать их в int. Это будет через вышеуказанную ошибку. поэтому сначала заполните все пустые элементы в столбце, затем примените это ...

df ['col']. replace ('', '0', inplace = True)

df['col'].astype(int)

For пример:

df=pd.DataFrame(['1','2','4','3',''])

df.replace ('', '0', inplace = True)

df=df.astype('int')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...