【问题标题】:Dataframe query for converting pandas dataframe to nested json用于将熊猫数据框转换为嵌套 json 的数据框查询
【发布时间】:2021-06-13 00:24:16
【问题描述】:

感谢您提前提供的所有帮助。 我只是在 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. 如何将timestampoffset 附加到每个json 对象?
  2. 我只能附加嵌套的 json 对象 Data. 块,而我找不到附加 OldData. json 对象的解决方案。

我提到了很多例子,但无法弄清楚。请告诉我您宝贵的解决方案。

【问题讨论】:

    标签: python-3.x pandas dataframe pandas-groupby series


    【解决方案1】:

    试试这个。列表“final_list”应该是您预期的数据帧到 json 转换输出。

    据我所知,您需要分别为“Data”和“OldData”应用 my_func1 以获得所需的结果。

    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()]
    

    【讨论】:

    • 好吧,我试图使用 to_json,因为我在数据框单元格中有 NA 类型。我怀疑使用 groupby 来轻松处理会更容易。
    • groupby 方法需要一个数值聚合列。如果你有,请继续。我已经编辑了我的答案,这可能更接近您希望解决此问题的方式。希望对您有所帮助。
    猜你喜欢
    • 2020-10-18
    • 2021-10-08
    • 2021-08-21
    • 1970-01-01
    • 2022-01-06
    • 2017-11-28
    • 1970-01-01
    相关资源
    最近更新 更多