У меня возникли некоторые проблемы с перебором фрейма данных: я заметил, что фрейм данных после чтения из перехвата не может использоваться из-за 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 - возможно, понижение рейтинга возможно на данный момент ..