【问题标题】:pyarrow data types for columns that have lists of dictionaries?具有字典列表的列的pyarrow数据类型?
【发布时间】:2020-12-12 15:52:34
【问题描述】:

当我保存到 parquet 文件时,是否应该为包含字典列表的列使用特殊的 pyarrow 数据类型?

如果我将列表或字典列表保存为字符串,我通常必须 .apply(eval) 该字段如果我再次将其读入内存以便熊猫将数据识别为列表(因此我可以使用 @ 对其进行规范化987654322@)

column_a:

[
 {"id": "something", "value": "else"},
 {"id": "something2", "value": "else2"},
]

column_b:

["test", "test2", "test3"]

只是想知道我是否应该将此数据保存为字符串以外的其他内容。

编辑 - 从 Zendesk 粘贴一些原始 JSON 的 sn-p。 audits 字段有一个名为 events 的字段,它是一个字典列表。在其中,还可以有其他字典列表(附件,其中有一个名为thumbnails的字典列表)

你能用 pa.map_ 来处理这样的情况吗?我有时需要从这些我最初甚至不知道存在的嵌套字段中检索数据。在我当前的 parquet 数据集中,events 字段只是一列 (字符串类型)即使里面有很多嵌套字段。

udt = pa.map_(pa.string(), pa.string())

.

  "audit": {
    "id": ,
    "ticket_id": ,
    "created_at": "",
    "author_id": ,
    "events": [
      {
        "id": ,
        "type": "",
        "author_id": ,
        "body": "" ,
        "plain_body": "",
        "public": false,
        "attachments": [
          {
            "url": "",
            "id": ,
            "file_name": "",
            "content_url": "",
            "content_type": "image/png",
            "size": 2888,
            "width": 100,
            "height": 30,
            "inline": false,
            "deleted": false,
            "thumbnails": [
              {
                "url": "",
                "id": ,
                "file_name": "",
                "content_url": "",
                "mapped_content_url": "",
                "content_type": "image/png",
                "size": 2075,
                "width": 80,
                "height": 24,
                "inline": false,
                "deleted": false
              }
            ]
          },

【问题讨论】:

  • 为什么投反对票?似乎是一个有趣的问题。

标签: pandas parquet pyarrow


【解决方案1】:

假设您有一个带有“字典”和字符串列的 df,并且字典都具有相同的键(在您的情况下为 id、值):

df = pd.DataFrame({
        'col1': pd.Series([
            {"id": "something", "value": "else"}, 
            {"id": "something2", "value": "else2"}
        ]),
        'col2': pd.Series(['foo', 'bar'])
    }
)

udt = pa.struct([pa.field('id', pa.string()), pa.field('value', pa.string())])
schema = pa.schema([pa.field('col1', udt), pa.field('col2', pa.string())])

table = pa.Table.from_pandas(df, schema)
df = table.to_pandas()

如果你的字典没有相同的键或者你事先不知道字典的键,你可以这样做:

df = pd.DataFrame({
        'col1': pd.Series([
            [('id', 'something'), ('value', '"else')],
            [('id', 'something2'), ('value','else2')],
        ]),
        'col2': pd.Series(['foo', 'bar'])
    }
)

udt = pa.map_(pa.string(), pa.string())
schema = pa.schema([pa.field('col1', udt), pa.field('col2', pa.string())])

table = pa.Table.from_pandas(df, schema)

请注意,col1 的格式不同(它使用对列表而不是字典)。 您也不能将您的表格转换回熊猫,因为它不受支持(尚):

table.to_pandas()
>>> ArrowNotImplementedError: No known equivalent Pandas block for Arrow data of type map<string, string> is known.


【讨论】:

  • 酷 - 谢谢。我想我还不能使用它,因为我需要将数据返回给 pandas 以将其展平以用于 csv 文件或可视化。我用一个更复杂的现实生活示例编辑了我的问题 - 这个 pa.map_ 会处理嵌套字段中的嵌套字段吗?
  • pa.map_ 不起作用,因为这些值必须是相同的类型。您可以为缩略图定义一个pa.struct,然后为具有缩略图pa.list_ 的附件定义一个pa.struct。但考虑到数据的深度嵌套性质以及存在大量重复字段(每条记录中有许多附件/缩略图)的事实,它们不太适合像箭头或 pandas 数据框这样的列格式。
猜你喜欢
  • 2018-12-25
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 2023-02-05
  • 2019-07-15
  • 2021-05-19
  • 1970-01-01
相关资源
最近更新 更多