熊猫ValueError:缓冲区源数组是只读的

时间:2018-12-31 09:05:01

标签: pandas cython parquet

我正在尝试将Parquet文件读入Pandas数据框。使用下面的API(或者即使我使用pd.read_parquet()包装器),也被ValueError buffer source array is read-only击中。

已经在线搜索了,这似乎与Cython不支持只读缓冲区有关,但是我找不到任何解决该问题的方法。

当API抛出ValueError缓冲区源数组为只读时,如何将Parquet文件读入Pandas数据框中?

In [1]: import pandas as pd
   ...: import numpy as np
   ...: import pyarrow as pa
   ...: import pyarrow.parquet as pq

In [2]: table = pq.read_table('Parquet/Journal.parquet', columns=['SOURCE_CODE','YEAR','MONTH','AMOUNT'])

In [3]: df = table.to_pandas()

In [4]: df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 85326489 entries, 0 to 85326488
Data columns (total 4 columns):
AMOUNT         float64
SOURCE_CODE    category
YEAR           category
MONTH          category
dtypes: category(3), float64(1)
memory usage: 895.1 MB

In [5]: df.groupby(['SOURCE_CODE','YEAR','MONTH'])['AMOUNT'].sum()

2 个答案:

答案 0 :(得分:2)

这是最新版本的熊猫(0.23.x)中的错误,将在熊猫0.24+中解决。其他用户已经报告了此问题:https://github.com/pandas-dev/pandas/issues/23276,并且通过以下拉取请求已得到解决:https://github.com/pandas-dev/pandas/pull/21688

要获得可靠的修复,您需要等待新的Pandas版本或手动安装git master。解决方法是,您可以通过df['__dummy__'] = np.nan添加虚拟浮点列来解决此问题。这将迫使熊猫的BlockManager重新排列浮点列,并应将AMOUNT变成可写列。

答案 1 :(得分:1)

我通过在应用分组方式之前添加一个来解决此问题。

df = df.copy() #add this line

df.groupby(['SOURCE_CODE','YEAR','MONTH'])['AMOUNT'].sum()