Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从pickle加载SparseDtype[';string';,pd.NA]的数据帧会导致错误,具体取决于数据帧的大小_Python_Pandas_Dataframe_Pickle - Fatal编程技术网

Python 从pickle加载SparseDtype[';string';,pd.NA]的数据帧会导致错误,具体取决于数据帧的大小

Python 从pickle加载SparseDtype[';string';,pd.NA]的数据帧会导致错误,具体取决于数据帧的大小,python,pandas,dataframe,pickle,Python,Pandas,Dataframe,Pickle,我在酸洗数据帧时遇到了一些问题:我观察到,从pickle读取后的数据帧不可用,因为StringArray需要一系列字符串或pandas.NA。进一步的测试导致我创建了一个很小的测试用例,但有趣的是,数据框架需要足够大,以便我的问题能够重现 import pandas as pd import numpy as np # create a data frame with 5 rows df_small = pd.DataFrame( {'A': list(range(5)),

我在酸洗数据帧时遇到了一些问题:我观察到,从pickle读取后的数据帧不可用,因为
StringArray需要一系列字符串或pandas.NA
。进一步的测试导致我创建了一个很小的测试用例,但有趣的是,数据框架需要足够大,以便我的问题能够重现

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)

几乎任何我可以尝试用dfu large1做的事情都会抛出这个错误

当类型的赋值被注释掉时,问题就消失了。不幸的是,我拥有的大多数列的密度都在1%以下,并且总的数据量非常大,所以我或多或少地被稀疏数据对象所困扰

此外,无论是否使用SparseDtype,
df_small.isna()
df_small1.isna()
都会显示不同的结果-正如前者所预期的那样,但后者的结果都是
False

有什么想法可以改变我的行为来避免这种行为吗


这是在Python 3.8.1和pandas 1.0.0上完成的-在这一点上,降级可能是一个选项。

在pandas 1.0.1中酸洗后,我在non-sparse StringArray上得到相同的错误。在pandas 1.0.2中酸洗后,我在non-sparse StringArray上得到相同的错误。在pandas 1.0.1中,我在pandas 1.0.2中得到相同的错误