Преобразование чисел с плавающей запятой в целые столбца с числами и нансами

Я работаю с Python 3.6 и Pandas 1.0.3.

Я хотел бы преобразовать поплавки из столбца «A» в int... Этот столбец имеет некоторые значения nan.

Итак, я последовал за этим сообщением с решение @jezrael.

Но я получаю следующую ошибку: «TypeError: невозможно безопасно преобразовать неэквивалентный float64 в int64»

это мой код

import pandas as pd
import numpy as np

data = {'timestamp': [1588757760.0000, 1588757760.0161, 1588757764.7339, 1588757764.9234], 'A':[9087.6000, 9135.8000, np.nan, 9102.1000], 'B':[0.1648, 0.1649, '', 5.3379], 'C':['b', 'a', '', 'a']}
df = pd.DataFrame(data)
df['A'] = pd.to_numeric(df['A'], errors='coerce').astype('Int64')
print(df)

Я что-то пропустил?


person David    schedule 10.05.2020    source источник


Ответы (2)


Ваша проблема в том, что у вас есть настоящие числа с плавающей запятой, а не целые числа в форме с плавающей запятой. Поэтому из соображений безопасности панды не будут их конвертировать, потому что вы получите другие значения.

Поэтому вам нужно сначала явно округлить их до целых чисел и только потом использовать метод the.astype():

df['A'] = pd.to_numeric(df['A'].round(), errors='coerce').astype('Int64')

Тест:

print(df)
      timestamp     A       B  C
0  1.588758e+09  9088  0.1648  b
1  1.588758e+09  9136  0.1649  a
2  1.588758e+09   NaN           
3  1.588758e+09  9102  5.3379  a
person MarianD    schedule 10.05.2020
comment
Спасибо @MarianD. Это решение, по-видимому, дает тот же результат, что и решение NYC Coder. Значение nan преобразуется в ‹NA›. Можно ли преобразовать это значение в «нан», как изначально? Я обновлю свой пост, чтобы объяснить результат, который я получаю с вашим решением. - person David; 10.05.2020
comment
@ Дэвид, нет. nan относится к типу данных float64, и все данные в столбце должны иметь один и тот же тип данных; Тип данных Int64 со значениями NaN является экспериментальным и может быть удален в будущих версиях панд. - person MarianD; 10.05.2020
comment
Эффективно. Спасибо за это разъяснение. Ваш ответ тоже очень хорош, это ‹NA›, которые я получаю, просто не раздражает, потому что я могу рассматривать их как пустые данные. Большое спасибо @MarianD! - person David; 10.05.2020

Один из способов сделать это — преобразовать NaN в целое число:

df['A'] = df['A'].fillna(99999999).astype(np.int64, errors='ignore')
df['A'] = df['A'].replace(99999999, np.nan)
df

    timestamp   A   B   C
0   1.588758e+09    9087    0.1648  b
1   1.588758e+09    9135    0.1649  a
2   1.588758e+09    NaN     
3   1.588758e+09    9102    5.3379  a
person NYC Coder    schedule 10.05.2020
comment
df['A'] = df['A'].astype(np.int64, errors='ignore') - person David; 10.05.2020
comment
Это не изменит его на целое число. Это проигнорирует все ошибки, включая ошибку преобразования float в int. - person NYC Coder; 10.05.2020
comment
Да, в самом деле. Я хочу сохранить значения «нан». - person David; 10.05.2020
comment
Проверьте отредактированный ответ. К сожалению, нет хорошего способа сделать это. - person NYC Coder; 10.05.2020
comment
Спасибо @NYC Coder, я только что проверил. Но, похоже, это не работает, за исключением изменения следующей строки df['A'] = df['A'].fillna(99999999).astype(np.int64, errors='ignore') на df['A'] = df['A'].fillna(99999999).astype(np.int64, errors='ignore').astype('Int64'), но это не идеально, потому что значение nan было преобразовано в ‹NA› - person David; 10.05.2020
comment
Я не понимаю, что ты делаешь. 2 шага, которые я дал выше, должны работать. Второй .astype('Int64') не требуется. - person NYC Coder; 10.05.2020
comment
На самом деле, я получаю этот вывод без второй временной метки .astype('Int64') ``` A B C 0 1.588758e+09 9087.0 0.1648 b 1 1.588758e+09 9135.0 0.1649 a 2 1.588758e+09 NaN 3 1.588758e+09 9102.7 a 5`3``` - person David; 10.05.2020