Pandas, astype (int), примененный к столбцу с плавающей точкой, возвращает отрицательные числа - PullRequest
0 голосов
/ 31 мая 2019

Моя задача - читать данные из Excel в dataframe. Данные немного беспорядочные, и для их устранения я сделал:

df_1 = pd.read_excel(offers[0])
df_1 = df_1.rename(columns={'Наименование [Дата Файла: 29.05.2019 время: 10:29:42 ]':'good_name', 
                     'Штрихкод':'barcode', 
                     'Цена шт. руб.':'price',
                     'Остаток': 'balance'
                    })
df_1 = df_1[new_columns]
# I don't know why but without replacing NaN with another char code doesn't work
df_1.barcode = df_1.barcode.fillna('_')
# remove all non-numeric characters
df_1.barcode = df_1.barcode.apply(lambda row: re.sub('[^0-9]', '', row))
# convert str to numeric
df_1.barcode = pd.to_numeric(df_1.barcode, downcast='integer').fillna(0)
df_1.head()

Возвращает столбец штрих-кода с типом float64 (почему так?)

0    0.000000e+00
1    7.613037e+12
2    7.613037e+12
3    7.613034e+12
4    7.613035e+12
Name: barcode, dtype: float64

Затем я пытаюсь преобразовать этот столбец в целое число.

df_1.barcode = df_1.barcode.astype(int)

Но я продолжаю получать глупые отрицательные числа.

df_1.barcode[0:5]
0             0
1   -2147483648
2   -2147483648
3   -2147483648
4   -2147483648

Name: barcode, dtype: int32

Благодаря @Will и @micric в конце концов у меня есть решение.

df_1 = pd.read_excel(offers[0])
df_1 = df_1[new_columns]
# replacing NaN with 0, it'll help to convert the column explicitly to dtype integer
df_1.barcode = df_1.barcode.fillna('0')
# remove all non-numeric characters
df_1.barcode = df_1.barcode.apply(lambda row: re.sub('[^0-9]', '', row))
# convert str to integer
df_1.barcode = pd.to_numeric(df_1.barcode, downcast='integer')

Резюме:

  • pd.to_numeric конвертирует NaN в float64. В результате из столбца с и значения NaN, и не-Nan, мы должны ожидать столбец dtype float64.
  • Проверьте размер номера, с которым вы имеете дело. Int32 имеет свой предел, который 2 ** 32 = 4294967296. Большое спасибо за вашу помощь, ребята!

Ответы [ 3 ]

1 голос
/ 31 мая 2019

Это число является 32-битным нижним пределом. Ваш номер находится за пределами диапазона int32, который вы пытаетесь использовать, поэтому он возвращает вам лимит (обратите внимание, что 2 ** 32 = 4294967296, разделенное на 2 2147483648, который является вашим номером).

Вместо этого следует использовать astype (int64).

1 голос
/ 31 мая 2019

Много вопросов в одном.

Итак, ваш ожидаемый dtype ...

pd.to_numeric(df_1.barcode, downcast='integer').fillna(0)

pd.to_numeric при понижении до целого числа вы получите целое число, однако у вас есть NaN в ваших данных, и пандам необходимо использовать тип float64 для представления NaN

0 голосов
/ 12 июля 2019

Я столкнулся с той же проблемой, что и OP, используя

astype(np.int64)

решено, см. Ссылку здесь .

Мне нравитсяэто решение, потому что оно соответствует моей привычке менять тип столбца pandas, возможно, кто-то может проверить производительность этих решений.

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