У меня есть конкретный случай, когда у меня огромные целые числа на входе, и преобразование в 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 метод продвижения .
Кто-то уже сделал это? и это вообще возможно?
С уважением,