Моя задача - читать данные из 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.
Большое спасибо за вашу помощь, ребята!