将数据框添加到特定形式的词典列表

2024-07-08 18:28:12 发布

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

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

序列号,时间戳,参数1,参数2,参数3,。。。你知道吗

这个数据帧可以有多个序列号,所以我需要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       |
|-----------|------------------------------------------|---------------------------|

我该怎么办?你知道吗


Tags: 数据nonamejson参数格式时间serial
2条回答

我不知道在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()

单凭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'}

相关问题 更多 >

    热门问题