python - 如何在 Python 中从 pandas 数据框创建嵌套的 JSON

标签 python json python-3.x pandas dataframe

我有一个包含 Windows 10 日志的 Pandas 数据框。我希望这个 pandas df 转换为 JSON。执行此操作的有效方法是什么?

我已经让它生成了一个默认的 pandas df,但是这不是嵌套的。我多么想要它

{
    "0": {
        "ProcessName": "Firefox",
        "time": "2019-07-12T00:00:00",
        "timeFloat": 1562882400.0,
        "internal_time": 0.0,
        "counter": 0
    },
    "1": {
        "ProcessName": "Excel",
        "time": "2019-07-12T00:00:00",
        "timeFloat": 1562882400.0,
        "internal_time": 0.0,
        "counter": 0
    },
    "2": {
        "ProcessName": "Word",
        "time": "2019-07-12T01:30:00",
        "timeFloat": 1562888000.0,
        "internal_time": 1.5533333333,
        "counter": 0
}

我希望它看起来像这样

{
    "0": {
        "time": "2019-07-12T00:00:00",
        "timeFloat": 1562882400.0,
        "internal_time": 0.0,
        "Processes" : {
                     "Firefox" : 0 # ("counter" value),
                     "Excel" : 0 
    },
    "1": ...
}

最佳答案

在我看来,您想从基于 ['time', 'timeFloat', 'internal_time'] 的聚合数据创建 JSON,您可以这样做:

pd.groupby(['time', 'timeFloat', 'internal_time'])

但是,您的示例表明您想要维护索引键(“0”、“1” 等),这与之前陈述的意图相反。

一个时间点的聚合值:

"Firefox" : 0
"Excel" : 0 

似乎对应于这些索引键,这些键在您进行聚合时会丢失。

但是,如果您决定使用聚合,代码将如下所示:

# reading in data:

import pandas as pd
import json
json_data = {
    "0": {
        "ProcessName": "Firefox",
        "time": "2019-07-12T00:00:00",
        "timeFloat": 1562882400.0,
        "internal_time": 0.0,
        "counter": 0
    },
    "1": {
        "ProcessName": "Excel",
        "time": "2019-07-12T00:00:00",
        "timeFloat": 1562882400.0,
        "internal_time": 0.0,
        "counter": 0
    },
    "2": {
        "ProcessName": "Word",
        "time": "2019-07-12T01:30:00",
        "timeFloat": 1562888000.0,
        "internal_time": 1.5533333333,
        "counter": 0
}}

df = pd.DataFrame.from_dict(json_data)
df = df.T
df.set_index(["ProcessName", 'time', 'timeFloat', 'internal_time', 'counter'])

# processing:
ddf = df.groupby(['time', 'timeFloat', 'internal_time'], as_index=False).agg(lambda x: list(x))
ddf['Processes'] = ddf.apply(lambda r: dict(zip(r['ProcessName'], r['counter'])), axis=1)
ddf = ddf.drop(['ProcessName', 'counter'], axis=1).

# printing the result:
json2 = json.loads(ddf.to_json(orient="records"))
print(json.dumps(json2, indent=4, sort_keys=True))

结果:

[
    {
        "Processes": {
            "Excel": 0,
            "Firefox": 0
        },
        "internal_time": 0.0,
        "time": "2019-07-12T00:00:00",
        "timeFloat": 1562882400.0
    },
    {
        "Processes": {
            "Word": 0
        },
        "internal_time": 1.5533333333,
        "time": "2019-07-12T01:30:00",
        "timeFloat": 1562888000.0
    }
]

关于python - 如何在 Python 中从 pandas 数据框创建嵌套的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57040398/

相关文章:

python - 在 Python 中使用 Marionette/Selenium 的多个 Firefox 实例

python - 如何在类中使用装饰器

python - 更改上下文的背景图

python - 如何从 Python 中的 pandas 数据框中获取 networkx 图的分支作为列表?

javascript - 使用来自 Ajax 响应的 JSON 数据数组?

python - Python 中的通用类工厂

python - 颜色编码图 Python

c# - Primary 宕机,Secondary 现在是 Primary - 如何写入新的 Primary?

javascript - 使用 Json 删除 ASP.NET 中不需要的符号

python - 我们如何在 jsonpath_ng python 中使用正则表达式过滤器,它将/视为排序方向。有什么替代方案吗?