如何转换这个数据帧来获得这个json结构?

2024-09-29 19:13:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个具有以下结构的数据帧:

          RegisteredTime                 Start      Value
1    2016-04-17 15:30:00   2016-04-18 00:00:00    1000.00
2    2016-04-17 15:30:00   2016-04-18 01:00:00    2000.00
3    2016-04-17 15:30:00   2016-04-18 02:00:00    3000.00
4    2016-04-17 15:30:00   2016-04-18 03:00:00    4000.00
5    2016-04-17 15:30:00   2016-04-18 04:00:00    5000.00

它按RegistredTime排序,每个RegisteredTime正好有24个条目。你知道吗

我可以用df.to_json(orient='record')转换为json,这给了我类似的东西:

[
    {
        "RegisteredTime": "2016-04-17 15:30:00",
        "Start": "2016-04-18T00:00:00",
        "Value": 1000.00,
    },
    {
        "RegisteredTime": "2016-04-17 15:30:00",
        "Start": "2016-04-18T0:00:00",
        "Value": 2000.00,
    },
    ...
]

我对熊猫的经验很少,我真正想要的结构是:

[ 

    {
        "SamplingTime": "2016-04-17 15:30:00",
        "Values": [
                      {
                          "Start": "2016-04-18T00:00:00",
                          "Value": 1000.00
                      },
                      {
                          "Start": "2016-04-18T01:00:00",
                          "Value": 2000.00
                      },
                      ...
                  ]
    },
    ...
]

有人能帮我怎么做到这一点吗?你知道吗

提前谢谢。你知道吗


Tags: to数据jsondf排序value条目经验
2条回答

SamplingTime分组并调用to_dict两次(一次在组中,一次在整组中)应该可以做您想要的事情。你知道吗

df2 = df.rename(columns = {"RegisteredTime": "SamplingTime"}) #assigning to another df in case you want to keep the original column name 
df2.head(10)
Out[196]: 
       SamplingTime             Start  Value
0  17/04/2016 15:30  18/04/2016 00:00   1000
1  17/04/2016 15:30  18/04/2016 01:00   2000
2  17/04/2016 15:30  18/04/2016 02:00   3000
3  17/04/2016 15:30  18/04/2016 03:00   4000
4  17/04/2016 15:30  18/04/2016 04:00   5000
5  17/04/2016 15:40  18/04/2016 00:00   1000
6  17/04/2016 15:40  18/04/2016 01:00   2000
7  17/04/2016 15:40  18/04/2016 02:00   3000
8  17/04/2016 15:40  18/04/2016 03:00   4000
9  17/04/2016 15:40  18/04/2016 04:00   5000

dtj = pd.DataFrame(df2.groupby("SamplingTime")["Start", "Value"].apply(lambda x: x.to_dict("r")), columns = ["Values"]).reset_index().to_dict("r")

print(dtj)
Out[199]: 
[{'SamplingTime': '17/04/2016 15:30',
  'Values': [{'Start': '18/04/2016 00:00', 'Value': 1000L},
   {'Start': '18/04/2016 01:00', 'Value': 2000L},
   {'Start': '18/04/2016 02:00', 'Value': 3000L},
   {'Start': '18/04/2016 03:00', 'Value': 4000L},
   {'Start': '18/04/2016 04:00', 'Value': 5000L}]},
 {'SamplingTime': '17/04/2016 15:40',
  'Values': [{'Start': '18/04/2016 00:00', 'Value': 1000L},
   {'Start': '18/04/2016 01:00', 'Value': 2000L},
   {'Start': '18/04/2016 02:00', 'Value': 3000L},
   {'Start': '18/04/2016 03:00', 'Value': 4000L},
   {'Start': '18/04/2016 04:00', 'Value': 5000L}]},
 {'SamplingTime': '17/04/2016 15:50',
  'Values': [{'Start': '18/04/2016 00:00', 'Value': 1000L},
   {'Start': '18/04/2016 01:00', 'Value': 2000L},
   {'Start': '18/04/2016 02:00', 'Value': 3000L},
   {'Start': '18/04/2016 03:00', 'Value': 4000L},
   {'Start': '18/04/2016 04:00', 'Value': 5000L}]}]

这是一个列表,因此如果您需要它作为JSON字符串,您可以调用json.dumps(dtj),也可以将最后一个to_dict更改为to.json(orient = "records")。你知道吗

如果我正确理解了你的问题,你想按注册时间对结果进行分组。你知道吗

您可以从将数据放入多个dict开始(就像调用to\u json方法时所做的那样,之后类似这样:

data = {}
for data_point in my_data:
    time = data_point['RegisteredTime']
    if time not in data:
        data[time] = []
    d = {}
    d['Start'] = data_point['Start']
    d['Value'] = data_point['Value']
    data[time].append(d)

result = []
for key, value in data.items():
    result.append({
        'SamplingTime': key,
        'Values': value
    })

在此之后,列表结果以您想要的格式包含所有信息。你知道吗

这可能不是解决这个问题的最“pythonic”的方法,但我尝试将步骤分开,以便更容易理解。希望有帮助。你知道吗

相关问题 更多 >

    热门问题