На самом деле я получаю сгенерированный Pandas JSON, который я загружаю для создания Dataframe. В его Dataframe есть несколько вложенных столбцов массива, которые мне нужно перебрать;
Простая загрузка pandas.read_json()
дает столбец с массивами, и я не могу работать с ним. Ниже код:
import pandas
dataframe = pandas.read_json('/Users/***/Downloads/df_teste.json', orient='table')
print(dataframe)
Возвращает мне Dataframe, как показано выше:
И мой вопрос: как я могу читать, как этот?
В целях тестирования я загружаю с помощью приведенного ниже 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 для получения ожидаемого вывода. Здесь я создал ожидаемый вывод с использованием json_normalize из вашего ввода json.
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, вы можете получить желаемый результат. Вот результат. Ps столбцы неупорядочены, вы можете заказать их. Спасибо
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: Я не уверен, что это то, чего вы ожидаете. Вы можете просто использовать pd.to_datetime в столбце optin_at. Я предоставил код ниже,
df['optin_at'] = pd.to_datetime(df['optin_at'])
print(df['optin_at'])
Если вы добавите эти две строки, он напечатает optin_at в формате даты и времени. Вывод
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
Надеюсь, это поможет, дайте знать, если это не так. Спасибо
Как я могу прочитать столбец
optin_at
как объект даты и времени?