Преобразовать столбец pandas (содержащий значения типа float и NaN) из float64 в nullable int8 - PullRequest
1 голос
/ 10 апреля 2020

У меня есть большой фрейм данных, который выглядит примерно так:

    a   b   c
0   2.2 6.0 0.0
1   3.3 7.0 NaN
2   4.4 NaN 3.0
3   5.5 9.0 NaN

Столбцы b и c содержат значения с плавающей точкой, которые являются положительными, натуральными числами или NaN. Однако они хранятся как float64, что является проблемой, поскольку (не вдаваясь в подробности) этот фрейм данных является входом конвейера, который требует, чтобы они были целыми числами, поэтому я хочу сохранить их как таковые. Вывод должен выглядеть следующим образом:

    a   b   c
0   2.2 6   0
1   3.3 7   NaN
2   4.4 NaN 3
3   5.5 9   NaN

В документации pandas я прочитал, что целые числа, допускающие обнуляемость, поддерживаются только в типе данных pandas Int8 (примечание: это отличается от np.int8) Естественно, я попытался это сделать:

df = df.astype({'b':pd.Int8Dtype(), 'c':pd.Int8Dtype()})

Это работает, когда я запускаю его в своем ноутбуке Jupyter, но когда я интегрирую его в более крупную функцию, я получаю эту ошибку:

TypeError: cannot safely cast non-equivalent float64 to int8

Я понимаю, почему я получаю ошибку, так как x == int (x) будет False для значений NaN, поэтому программа считает это преобразование небезопасным, даже если все Значения либо NaN, либо натуральное число. Итак, я попытался:

'df = df.astype({'b':pd.Int8Dtype(), 'c':pd.Int8Dtype()}, errors='ignore')

Я решил, что это избавит от проблемы «небезопасного преобразования», так как я на 100% уверен, что все значения float64 являются натуральными числами. Однако, когда я использую эту строку, все мои числа по-прежнему хранятся как числа с плавающей точкой! Бесит!

У кого-нибудь есть обходной путь для этого?

...