【问题标题】:Pandas Dataframe to list of dictionaries of specific formatPandas Dataframe 到特定格式的字典列表
【发布时间】:2018-06-13 12:22:00
【问题描述】:

我有一个包含以下列的数据框:

序列号、时间戳、参数1、参数2、参数3、...

这个数据帧可以有多个serial_no。所以我需要它的json格式如下:

[
 {
   'serial_no':'a001',
    'readings':[
      {
       'name':'parameter1',
       'datapoints':[
          ('2018-01-01 00:00:00',5),('2018-01-01 00:01:00',35),..
        ]
      },{'name':'parameter2',..},..
     ]
 },{'serial_no':'a002',..},..
]

样本表数据:

|-----------|------------------------------------------|---------------------------|
| serial_no |         timestamp          | parameter1  | parameter2  | parameter3  |
|-----------|------------------------------------------|---------------------------|
|   a001    |   '2018-01-01 00:00:00'    |     5       |     4       |     3       |
|-----------|------------------------------------------|---------------------------|
|   a001    |   '2018-01-01 00:01:00'    |     35      |     7       |     13      |
|-----------|------------------------------------------|---------------------------|
|   a002    |   '2018-01-01 00:01:03'    |     2       |     6       |     11      |
|-----------|------------------------------------------|---------------------------|
|   a002    |   '2018-01-02 05:00:00'    |     5       |     16      |     98      |
|-----------|------------------------------------------|---------------------------|
|   a003    |   '2018-01-02 05:32:01'    |     0       |     1.4     |     3       |
|-----------|------------------------------------------|---------------------------|

我该怎么做?

【问题讨论】:

  • 你能创建数据样本DataFrame吗? timestamp2 是列?
  • @jezrael 我添加了一些示例数据。我不知道如何创建要显示的表格,但我希望这可以理解
  • JSON 示例中的括号是什么?那不是 JSON。你想在那里表达什么?
  • @ypnos 哎呀,我的错。该格式的字典列表

标签: python python-2.7 pandas dataframe


【解决方案1】:

不知道pandas有没有直接的方式,但是你可以创建一个函数来写你的具体格式,然后使用groupbyapply,比如:

def create_specific_format (df_grouped):
    dict_output = {'serial_no': df_grouped['serial_no'].iloc[0]}
    dict_output['readings'] = []
    for col in ['parameter1','parameter2','parameter3']:
        dict_output['readings'].append({'name':col,
                                        'datapoints': df_grouped.apply(lambda row: (row['timestamp'], row[col]),1).tolist()})
    return dict_output

您想要的可以通过以下方式选择:

df.groupby('serial_no', as_index=False).apply(create_specific_format).tolist()

【讨论】:

  • 谢谢!我希望有一种方法可以在不循环的情况下做到这一点,但这似乎已经足够好了!
【解决方案2】:

单独使用 Pandas 方法没有直接的方法。但这是一个非常干净的方法:

columns = ['serial_no','timestamp','parameter1','parameter2','parameter3']
values = [['a001','2018-01-01 00:00:00',5,14,3],
        ['a001','2018-01-01 00:01:00',35,7,13],
        ['a002','2018-01-01 00:01:03',2,6,11],
        ['a002','2018-01-02 05:00:00',5,16,98],
        ['a003','2018-01-02 05:32:01',0,1.4,3]]

df = pd.DataFrame(values, columns=columns)

p_fields = ['parameter1', 'parameter2', 'parameter3']
serials = []

for sn, data in df.groupby('serial_no'):

    serial = {}
    serial['serial_no'] = sn
    serial['readings'] = []

    # Associate timestamps with parameter data
    params = {p: zip(data.timestamp, data[p]) for p in p_fields}
    readings = [{'name': p, 'datapoints': params[p]} for p in params]

    serial['readings'] = readings
    serials.append(serial)

serials[0]

{'readings': [{'datapoints': [('2018-01-01 00:00:00', 5),
    ('2018-01-01 00:01:00', 35)],
   'name': 'parameter1'},
  {'datapoints': [('2018-01-01 00:00:00', 3), ('2018-01-01 00:01:00', 13)],
   'name': 'parameter3'},
  {'datapoints': [('2018-01-01 00:00:00', 14.0), ('2018-01-01 00:01:00', 7.0)],
   'name': 'parameter2'}],
 'serial_no': 'a001'}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 2018-10-22
    • 2019-06-27
    • 2016-04-19
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多