【问题标题】:How to transform this dataframe to get this json structure?如何转换此数据框以获得此 json 结构?
【发布时间】:2016-04-17 20:11:41
【问题描述】:

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

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

我对 pandas 的经验很少,我真正想要的结构是这样的:

[ 

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

有人可以帮我实现这个吗?

提前致谢。

【问题讨论】:

    标签: python json pandas dataframe


    【解决方案1】:

    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")

    【讨论】:

      【解决方案2】:

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

      您可以首先将数据放入多个字典中(就像您在调用 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”的解决方法,但我尝试拆分步骤以便更容易理解。希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 2021-06-10
        • 2011-04-08
        • 1970-01-01
        • 1970-01-01
        • 2014-04-15
        • 1970-01-01
        • 1970-01-01
        • 2018-12-13
        • 1970-01-01
        相关资源
        最近更新 更多