Запрос фрейма данных для преобразования фрейма данных pandas во вложенный json
Заранее благодарим вас за помощь. Я только продвигаюсь в программировании на Python и нуждаюсь в вашей помощи в преобразовании фрейма данных в json.
У меня есть следующие столбцы и строки фрейма данных.
BinLogFilename, Type, Database, Data.col1, Data.col2, OldData.col1, OldData,col2, timestamp, offset.
mysql-bin.006423, INSERT, hybris, Sparta1, null, Greece1, null, 1615546843000, mysql-bin.006423:295851133
mysql-bin.006424, UPDATE, hybris, Sparta2, null, Greece2, null, 1615546843111, mysql-bin.006423:295851144
Я пытался создать json следующим образом:
[
{
"BinLogFilename": "mysql-bin.006423",
"Type": "INSERT",
"Database": "hybris",
"Data": {
"col1": "Sparta1",
"col2": null,
},
"OldData": {
"col1": "Greece1",
"col2": null,
},
"Timestamp": 1615546843000,
"Offset": "mysql-bin.006423:295851133"
},
{
"BinLogFilename": "mysql-bin.006423",
"Type": "UPDATE",
"Database": "hybris",
"Data": {
"col1": "Sparta2",
"col2": null,
},
"OldData": {
"col1": "Greece2",
"col2": null,
},
"Timestamp": 1615546843111,
"Offset": "mysql-bin.006423:295851144"
}
]
Вот код, который пытается сгенерировать json,
import json, pandas as pd
def my_func1(x, substring="Data."):
d = dict()
for key, value in x.items():
if key.startswith(substring):
d[key.replace(substring, "")] = value.to_list()[0]
return d
j = (df.groupby(['BinLogFilename','Type','Table','ServerId','BinLogPosition','Database'], as_index=True).apply(my_func1).reset_index().rename(columns={0:'Data'}).to_json(orient='records'))
К сожалению, мне не удалось выяснить следующее,
- Как мне прикрепить
timestamp
иoffset
каждому блоку json? - Это был всего лишь образец, о котором я говорил, но есть много столбцов, начинающихся с префикса и. Я хочу добавить блок
Data.
сначала и позжеOldData.
как показано в примере формата вывода. Как я могу это сделать?
Я приводил много примеров, но не мог понять. Пожалуйста, дайте мне знать ваши ценные решения.
1 ответ
Попробуй это. Список final_list должен быть вашим ожидаемым фреймом данных в преобразованный в json вывод.
Насколько мне известно, вы бы применили my_func1 для «Data» и «OldData» отдельно, чтобы получить желаемый результат.
import pandas as pd
df = pd.read_csv(r'G:/df.csv')
def my_func1(x, substring="Data"):
d = {} ; data = {}
for key, value in x.items():
if key.startswith(substring):
try:
if len(key.split('.')) > 1:
data[key.replace(key, key.split('.')[-1])] = value
d[key.split('.')[0]] = data
else:
d[key] = value
except:
d[key] = value
else:
d[key] = value
return d
df_to_json = eval(df.to_json(orient = 'index'))
final_list = [my_func1(my_func1(df_to_json[k], substring = 'Data'), substring = 'OldData') for k,v in df_to_json.items()]