Загрузка фрейма данных с помощью SparseDtype ['string', pd.NA] из соленья приводит к ошибкам в зависимости от размера фрейма данных - PullRequest
1 голос
/ 04 февраля 2020

У меня возникли некоторые проблемы с перебором фрейма данных: я заметил, что фрейм данных после чтения из перехвата не может использоваться из-за StringArray requires a sequence of strings or pandas.NA. Дальнейшие тесты привели к тому, что я создал небольшой sh тестовый пример, но интересная часть состоит в том, что фрейм данных должен иметь достаточный размер, чтобы моя проблема была воспроизводимой.

import pandas as pd
import numpy as np

# create a data frame with 5 rows
df_small = pd.DataFrame(
    {'A': list(range(5)),
     'B': ['v1', 'v1', 'v1', 'v2', pd.NA],
     'C': [pd.NA, 'value2', 'value1', 'value1', 'value1']})

# create a data frame with 25000 rows
df_large = pd.DataFrame(
    {'A': list(range(5)) * 5000,
     'B': ['v1', 'v1', 'v1', 'v2', pd.NA] * 5000,
     'C': [pd.NA, 'value2', 'value1', 'value1', 'value1'] * 5000})

# assign type, notice that the SparseDtype is used
df_small = df_small.astype({'A': 'int32', 'B': pd.SparseDtype('string', pd.NA), 'C': 'string'})
df_large = df_large.astype({'A': 'int32', 'B': pd.SparseDtype('string', pd.NA), 'C': 'string'})

#store to disk
df_small.to_pickle('issue_small.pkl')
df_large.to_pickle('issue_large.pkl')

# load from disk
df_small1 = pd.read_pickle((open('issue_small.pkl', 'rb')))
df_large1 = pd.read_pickle((open('issue_large.pkl', 'rb')))

# this one will print OK
print(df_small1.C)

# this one will throw a ValueError
print(df_large1.C)

Почти все, что я мог попробуй сделать с df_large1 скину эту ошибку.

Проблема исчезает, когда назначение типов закомментировано. К сожалению для меня, большинство моих столбцов имеют плотность менее 1%, а общий размер данных слишком велик, поэтому я более или менее застрял, используя редкие объекты данных.

Далее, с использованием или без использования SparseDtype, df_small.isna() и df_small1.isna() показывают разные результаты - как и ожидалось для первого, но все False для последнего.

Есть какие-нибудь идеи относительно того, что я мог бы изменить, чтобы обойти это поведение?

Это делается на Python 3.8.1 и pandas 1.0.0 - возможно, понижение рейтинга возможно на данный момент ..

...