Не сохранять в pandas DataFrame (несмотря на astype () и to_parquet ()) - PullRequest
1 голос
/ 28 апреля 2020

Как заставить pandas DataFrame сохранять значения None даже при использовании astype()?

Подробности

Поскольку конструктор pd.DataFrame не предлагает составных dtype параметр, я фиксирую типы (требуется для to_parquet()) с помощью следующей функции:

def _typed_dataframe(data: list) -> pd.DataFrame:
    typing = {
        'name': str,
        'value': np.float64,
        'info': str,
        'scale': np.int8,
    }    
    result = pd.DataFrame(data)
    for label in result.keys():
        result[label] = result[label].astype(typing[label])
    return result

К сожалению, result[info] = result[info].astype(str) преобразует все значения None в info в "None" строки. Как я могу запретить это, то есть сохранять None значения?

Точнее: None значения в data становятся np.nan в result DataFrame, которые становятся "nan" от astype(str), которые становятся "None" при извлечении из result.

1 Ответ

1 голос
/ 30 апреля 2020

После комментария @ frosty мы можем использовать альтернативу

    typing = {
        'name': str,
        'value': np.float64,
        'info': pd.StringDtype(),
        'scale': np.int8,
    }    

Однако для этого требуется pandas ~= 1.0.0.


В качестве лучшего решения вы можете заменить

for label in result.keys():
    result[label] = result[label].astype(typing[label])

на

result.astype(schema)

К сожалению, result.astype(typing) не имеет никакого эффекта, поскольку он не может обрабатывать составные типы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...