如何转换此数据帧以获得此json结构?

时间:2016-04-17 20:11:42

标签: python json pandas dataframe

我有一个具有这种结构的pandas数据帧:

callback

它按 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个,正好有24个条目。

我可以使用RegisteredTime转换为json,这给了我类似的内容:

df.to_json(orient='record')

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

[
    {
        "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,
    },
    ...
]

有人可以帮助我如何实现这个目标吗?

提前致谢。

2 个答案:

答案 0 :(得分: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")

答案 1 :(得分:1)

如果我正确理解了您的问题,您希望按照RegisteredTime对结果进行分组。

您可以先将数据放入几个dicts(就像调用to_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”方式,但我试图拆分步骤,以便更容易理解。希望它有所帮助。