【问题标题】:Pandas ValueError: buffer source array is read-onlyPandas ValueError:缓冲区源数组是只读的
【发布时间】:2018-12-31 09:05:00
【问题描述】:

我正在尝试将 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()

【问题讨论】:

  • 由于我们没有您的数据,因此验证行为并不容易。你能举一个独立的例子吗?
  • 另外,您使用的是哪个版本的熊猫? Cython 自 0.28 起支持只读内存视图,因此重新发送的 pandas 版本不应有此限制(或者至少在您报告问题时可以轻松修复)。
  • 我的熊猫版本是 0.23.4。 Cython 版本是 0.29.2。我是否需要为只读内存视图配置 cython?

标签: pandas cython parquet


【解决方案1】:

这是最新版 pandas (0.23.x) 中的一个错误,将在 pandas 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 添加一个虚拟浮点列来解决此问题。这将强制 pandas 的 BlockManager 对浮动列重新排序,并将 AMOUNT 变为可写列。

【讨论】:

  • 这是目前唯一的解决方法吗?复制没有只读标志的数据框会起作用吗?
  • 目前无法复制,但在接下来的 2-3 天内,Pandas 0.24 将发布以解决此问题。
【解决方案2】:

我通过在应用 groupby 之前添加一个来解决这个问题。

df = df.copy() #add this line

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

【讨论】:

    猜你喜欢
    • 2020-11-19
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 2023-03-03
    相关资源
    最近更新 更多