Изменить Pandas промоакции типа NA по умолчанию - PullRequest
2 голосов
/ 27 февраля 2020

У меня есть конкретный случай, когда у меня огромные целые числа на входе, и преобразование в float64 фактически меняет значение.

Согласно этой странице: https://pandas.pydata.org/pandas-docs/stable/user_guide/gotchas.html#na -type-promotions Pandas автоматически конвертирует целые числа с NA в float64.

Проблема в том, что когда у меня есть значение NA в моих входах, pandas автоматически приводит его к 'float64' даже если я указываю 'Int64' в конструкторе

, я написал сценарий repl.it с pandas 1.0.1 и python 3.8.1, показывающий мой вариант использования: https://repl.it/@RonanTREILLET / pandastestint

Для тех, кто не хочет играть в нее, вот в основном то, что я делаю:

test_df =[
    {'dataset_id': 327626200612520493}, 
    {'dataset_id': 327626200612520493}, 
]
df = DataFrame(data=test_df, columns=['dataset_id'])

, тогда, если я делаю

print(df[col_name])

вывод:

0    327626200612520493
1    327626200612520493
Name: dataset_id, dtype: int64

, что правильно

но, если я сделаю это :

print(df[col_name].astype('float').astype('Int64'))

I иметь такой вывод:

0    327626200612520512
1    327626200612520512
Name: dataset_id, dtype: Int64

, что неверно .

Основная проблема заключается в том, что вы создаете кадр данных с входными данными NA, например:

#test with a NA value in DF, showing how Pandas automatically cast to `'float64'`
test_with_nan_df =[
    {'dataset_id': 327626200612520493}, 
    {'dataset_id': None}
]
df_w_nan = DataFrame(data=test_with_nan_df, columns=['dataset_id'])
print(df_w_nan[col_name].astype('Int64'))

или

* 10 50 *

вывод такой же:

0    327626200612520512
1                  <NA>
Name: dataset_id, dtype: Int64

Как вы можете видеть, даже если я заставлю 'Int64' во время создания кадра данных, это все равно неправильное значение, и я предполагаю pandas внутренне приведенный столбец на 'float' перед приведением к 'Int64'

Так что IF мое использование Pandas правильно, я бы хотел написать патч для переопределения типа NA метод продвижения .

Кто-то уже сделал это? и это вообще возможно?

С уважением,

1 Ответ

2 голосов
/ 27 февраля 2020

Вы можете использовать object, чтобы pandas оставил данные без изменений. Затем вы можете вручную установить типы.

pd.DataFrame(data=test_with_nan_df, columns=['dataset_id'], dtype='object').astype('Int64')
#           dataset_id
#0  327626200612520493
#1                 NaN

#dataset_id    Int64
...