尝试将 DataFrame 写入羽毛时出错。羽毛是不是支持列表列?

Posted

技术标签:

【中文标题】尝试将 DataFrame 写入羽毛时出错。羽毛是不是支持列表列?【英文标题】:Error when trying to write DataFrame to feather. Does feather support list columns?尝试将 DataFrame 写入羽毛时出错。羽毛是否支持列表列? 【发布时间】:2019-06-18 16:20:21 【问题描述】:

我同时使用 R 和 Python,我想将我的一个 pandas DataFrames 编写为羽毛,以便在 R 中更轻松地使用它。但是,当我尝试将其编写为羽毛时,我得到了以下错误:

ArrowInvalid: trying to convert NumPy type float64 but got float32

我仔细检查了我的列类型,它们已经是 float 64:

In[1]
df.dtypes

Out[1]
id         Object
cluster    int64
vector_x   float64
vector_y   float64

无论使用feather.write_dataframe(df, "path/df.feather")df.to_feather("path/df.feather"),我都会遇到相同的错误。

我在 GitHub 上看到了这个,但不明白它是否相关:https://issues.apache.org/jira/browse/ARROW-1345 和 https://github.com/apache/arrow/issues/1430

最后,我可以将其保存为 csv 并更改 R 中的列(或仅在 Python 中进行整个分析),但我希望使用它。

编辑 1:

尽管有以下很好的建议,但仍然遇到同样的问题,所以更新我尝试过的内容。

df[['vector_x', 'vector_y', 'cluster']] = df[['vector_x', 'vector_y', 'cluster']].astype(float)

df[['doc_id', 'text']] = df[['doc_id', 'text']].astype(str)

df[['doc_vector', 'doc_vectors_2d']] = df[['doc_vector', 'doc_vectors_2d']].astype(list)

df.dtypes

Out[1]:
doc_id           object
text             object
doc_vector       object
cluster          float64
doc_vectors_2d   object
vector_x         float64
vector_y         float64
dtype: object

编辑 2:

经过大量搜索,问题似乎在于我的集群列是由 int64 整数组成的列表类型。所以我想真正的问题是,羽毛格式是否支持列表?

编辑 3:

为了把它打个结,feather 不支持像列表这样的嵌套数据类型,至少现在还不支持。

【问题讨论】:

将列表存储为字符串有效吗? 【参考方案1】:

您的问题是id Object 列。这些是 Python 对象,它们不能以语言中立的格式表示。这个羽毛(实际上是底层的 Apache Arrow / pyarrow)试图猜测 id 列的 DataType。猜测是在它在列中看到的第一个对象上完成的。这些是float64 numpy 标量。稍后,您有 float32 标量。 Arrow 没有将它们强制为某种类型,而是对类型更加严格并且失败了。

您应该能够通过确保所有列都具有df['id'] = df['id'].astype(float) 的非对象数据类型来解决此问题。

【讨论】:

id 列是一个字符串列——有没有我可以将其转换为与箭头兼容的类型? 是的,您可以使用df['id'].astype(str)确保列中的所有对象都是相同的Python类型。 仍然有同样的问题 - 看起来我实际上并没有从和 object 转换它。 . .我用我尝试过的代码更新了问题。 试试df['id'] = df['id'].astype('string')【参考方案2】:

经过大量研究,简单的答案是羽毛不支持列表(或其他嵌套数据类型)列。

【讨论】:

这里说羽毛 V2 支持列表列,但实际上我注意到它没有... ursalabs.org/blog/2020-feather-v2>【参考方案3】:
幸运的是,我在这里找到了羽化 IO 错误的原因。 我也得到了这个问题的解决方案,pandas.to_feather 和 read_feather 都是基于 pyarrow 的,并且从 2019 年开始,pyarrow 已经支持包含列表作为值的列。

解决方案:

pip install pyarrow==latest # my version is 1.0.0 and it work

那么,仍然使用 pd.to_feather("Filename") 和 read_feather。

【讨论】:

以上是关于尝试将 DataFrame 写入羽毛时出错。羽毛是不是支持列表列?的主要内容,如果未能解决你的问题,请参考以下文章

vijos 羽毛

使用python为非矩形图像添加羽毛效果

如何从反应原生包中禁用羽毛笔编辑器的自动缩放?

如何使用猫鼬羽毛适配器编写聚合?

羽毛球英文术语

如何使用带有羽毛/快递的 webpack-dev-middleware?