У меня есть фрагмент кода, который разбивает некоторые данные на ряды, вносит некоторые изменения, в том числе потенциально преобразует несколько значений в NaN, а затем в конечном итоге объединяет эти ряды в кадр данных.
(см. упрощенный код ниже)
sers = []
for item in items:
type_name = item.name
values = {pd.to_datetime(value.date_string): value.doc_count for value in item.values}
series = pd.Series(values, name=type_name, dtype=pd.Int64Dtype())
reindexed_series = series.reindex(date_range, fill_value=0)
exclude_inapplicable_days(reindexed_series, type_name)
apply_offset(reindexed_series, type_name)
sers.append(reindexed_series)
df = pd.DataFrame(sers)
в ignore_inapplicable_days и apply_offset Я меняю некоторые значения в этой серии на NaN, что имеет для нас другое значение, чем 0, которое мы использовали в качестве fill_value.
Все хорошо, пока это не просто серия, у них тип данных int благодаря его указанию, но df превращает все это обратно в числа с плавающей запятой, несмотря на все серии в sers
code> имеющий типы int, совместимые с NaN.
Почему это происходит? Есть ли способ обойти это, не повторяя df и не меняя все обратно?
Воспроизводимый пример:
import pandas as pd
date_range = pd.date_range(start="2023-01-01", end="2023-01-05")
items = [
{"name": "Type1", "values": [{"date_string": "2023-01-01", "doc_count": 1},
{"date_string": "2023-01-02", "doc_count": 2},
{"date_string": "2023-01-03", "doc_count": 3},
{"date_string": "2023-01-04", "doc_count": 4},
{"date_string": "2023-01-05", "doc_count": 5}]},
{"name": "Type2", "values": [{"date_string": "2023-01-01", "doc_count": 6},
{"date_string": "2023-01-02", "doc_count": 7},
{"date_string": "2023-01-03", "doc_count": 8},
{"date_string": "2023-01-04", "doc_count": 9},
{"date_string": "2023-01-05", "doc_count": 10}]}
]
def exclude_inapplicable_days(series, type_name):
series[series.index[0]] = pd.NA
print(f"After exclusion in {type_name}: {series.dtype}")
def apply_offset(series, type_name):
offset = {
"Type1": 2,
"Type2": 1
}[type_name]
if offset > 0:
series.iloc[-offset:] = pd.NA
print(f"After offset in {type_name}: {series.dtype}")
sers = []
for item in items:
type_name = item['name']
values = {pd.to_datetime(val['date_string']): val['doc_count'] for val in item['values']}
series = pd.Series(values, name=type_name, dtype=pd.Int64Dtype())
reindexed_series = series.reindex(date_range, fill_value=0)
exclude_inapplicable_days(reindexed_series, type_name)
apply_offset(reindexed_series, type_name)
sers.append(reindexed_series)
df = pd.DataFrame(sers)
print("DataFrame dtypes:")
print(df.dtypes)
Подробнее здесь: https://stackoverflow.com/questions/787 ... k-to-float
Pandas превращает pd.Int64Dtype обратно в Float ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Django tinymce превращает все текстовые поля в редактор форматированного текста
Anonymous » » в форуме Python - 0 Ответы
- 20 Просмотры
-
Последнее сообщение Anonymous
-