Запрос фрейма данных для преобразования фрейма данных 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'))

К сожалению, мне не удалось выяснить следующее,

  1. Как мне прикрепить timestamp и offset каждому блоку json?
  2. Это был всего лишь образец, о котором я говорил, но есть много столбцов, начинающихся с префикса и. Я хочу добавить блок 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()]
Другие вопросы по тегам