繁体   English   中英

如何使用嵌套数组创建 DataFrame

[英]How to Create a DataFrame with Nested Array

实际上我收到一个 Pandas 生成的 JSON,我加载它来创建一个 Dataframe。它的 Dataframe 有一些我需要迭代的嵌套数组列;

只需加载一个pandas.read_json()得到一个包含 arrays 的列,我无法在该列下工作。 波纹管代码:

import pandas

dataframe = pandas.read_json('/Users/***/Downloads/df_teste.json', orient='table')
print(dataframe)

像上面这样返回一个 Dataframe:

学生卡 姓名 创建时间 语言
1个 2019-01-03 14:30:32.146000+00:00 [{'language_id': 1, 'name': 'English', 'optin_...
2个 酒吧 2019-01-03 14:30:32.146000+00:00 [{'language_id': 1, 'name': 'English', 'optin_...

我的问题是:我怎样才能像这样阅读?

学生卡 language_id 语言名称 optin_at
1个 1个 英语 2019-01-03T14:30:32.148Z
2个 1个 英语 2021-05-30T00:33:02.915Z
2个 2个 葡萄牙语 2022-03-07T07:42:07.082Z

出于测试目的,我正在使用以下 JSON 加载:

{
  "schema": {
    "fields": [
      { "name": "student_id", "type": "string" },
      { "name": "name", "type": "string" },
      { "name": "created_at", "type": "datetime", "tz": "UTC" },
      { "name": "languages", "type": "string" }
    ],
    "pandas_version": "0.20.0"
  },
  "data": [
    {
      "student_id": "1",
      "name": "Foo",
      "created_at": "2019-01-03T14:30:32.146Z",
      "languages": [
        {
          "language_id": 1,
          "name": "English",
          "optin_at": "2019-01-03T14:30:32.148Z"
        }
      ]
    },
    {
      "student_id": "2",
      "name": "Bar",
      "created_at": "2019-01-03T14:30:32.146Z",
      "languages": [
        {
          "language_id": 1,
          "name": "English",
          "optin_at": "2021-05-30T00:33:02.915Z"
        },
        {
          "language_id": 2,
          "name": "Portuguese",
          "optin_at": "2022-03-07T07:42:07.082Z"
        }
      ]
    }
  ]
}

您可以使用 json_normalize 生成预期的 output,这里我使用 json_normalize 从您的输入 json 创建了预期的 output。

import pandas as pd
from pandas import json_normalize

data = {
  "schema": {
    "fields": [
      { "name": "student_id", "type": "string" },
      { "name": "name", "type": "string" },
      { "name": "created_at", "type": "datetime", "tz": "UTC" },
      { "name": "languages", "type": "string" }
    ],
    "pandas_version": "0.20.0"
  },
  "data": [
    {
      "student_id": "1",
      "name": "Foo",
      "created_at": "2019-01-03T14:30:32.146Z",
      "languages": [
        {
          "language_id": 1,
          "name": "English",
          "optin_at": "2019-01-03T14:30:32.148Z"
        }
      ]
    },
    {
      "student_id": "2",
      "name": "Bar",
      "created_at": "2019-01-03T14:30:32.146Z",
      "languages": [
        {
          "language_id": 1,
          "name": "English",
          "optin_at": "2021-05-30T00:33:02.915Z"
        },
        {
          "language_id": 2,
          "name": "Portuguese",
          "optin_at": "2022-03-07T07:42:07.082Z"
        }
      ]
    }
  ]
}


student_detail = ['student_id']
df = pd.json_normalize(data['data'], 'languages', student_detail)
print(df)

通过打印 df 你可以得到你想要的 output 。 这是 output。请注意,这些列是无序的,您可以订购。 谢谢

language_id        name                  optin_at student_id
0            1     English  2019-01-03T14:30:32.148Z          1
1            1     English  2021-05-30T00:33:02.915Z          2
2            2  Portuguese  2022-03-07T07:42:07.082Z          2

希望对您有所帮助,如果没有,请告知。 谢谢,

PS:我不确定这是否是您所期待的。 您可以简单地在 optin_at 列上使用 pd.to_datetime。 我在下面提供了代码,

df['optin_at'] = pd.to_datetime(df['optin_at'])
print(df['optin_at'])

如果添加这两行,它会以日期时间格式打印 optin_at。 Output

0   2019-01-03 14:30:32.148000+00:00
1   2021-05-30 00:33:02.915000+00:00
2   2022-03-07 07:42:07.082000+00:00

希望这会有所帮助,如果不是这种情况请告知。 谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM