【发布时间】:2020-07-26 11:56:55
【问题描述】:
我有一个大型数据集,其中包含(压缩)JSON 格式的许多列。我正在尝试将其转换为镶木地板以进行后续处理。某些列具有嵌套结构。现在我想忽略这个结构,把这些列写成一个(JSON)字符串。
所以对于我已经确定我正在做的列:
df[column] = df[column].astype(str)
但是,我不确定哪些列是嵌套的,哪些不是。当我用镶木地板写字时,我看到了这条消息:
<stack trace redacted>
File "pyarrow/_parquet.pyx", line 1375, in pyarrow._parquet.ParquetWriter.write_table
File "pyarrow/error.pxi", line 78, in pyarrow.lib.check_status
pyarrow.lib.ArrowInvalid: Nested column branch had multiple children: struct<coordinates: list<item: double>, type: string>
这表明我未能将我的列之一从嵌套对象转换为字符串。但应该归咎于哪一栏?我怎么知道?
当我打印我的 pandas 数据框的 .dtypes 时,我无法区分字符串和嵌套值,因为两者都显示为 object。
编辑:该错误通过显示结构详细信息来提示嵌套列,但这相当耗时。此外,它只打印第一个错误,如果您有多个嵌套列,这可能会很烦人
【问题讨论】:
-
当您说嵌套列时,您是指包含 Python 对象(
list、dict等)的任何列吗?你想把这些转换成字符串吗? -
您的数据框中的某些列似乎包含
pyarrow.parquet.write_table无法处理的 C 对象。 “嵌套列”只是镶木地板中的一个术语,在“熊猫数据框”中没有多大意义。请明确定义这些术语。 -
也许
df.applymap(type)以便获取数据框中每个单元格的类型...df.applymap(type).eq(dict).any()如果每列的任何单元格中都有字典,则返回 True。因此,如果我们使用df.applymap(type).eq(dict).any(),我们可以过滤列.. -
@ansev 我必须使用来自 Outlook API 的数据的流式数据集来执行此操作,这些数据总是会发生变化,有时还会带有嵌套和未嵌套的列。你的方法和我的很相似
标签: python python-3.x pandas pyarrow