Pandas Dataframe к списку словарей определенного формата - PullRequest
0 голосов
/ 13 июня 2018

У меня есть кадр данных со следующими столбцами:

serial_no, отметка времени, параметр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       |
|-----------|------------------------------------------|---------------------------|

Как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Нет простого способа сделать это только с помощью методов Панд.Но вот довольно чистый подход:

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'}
0 голосов
/ 13 июня 2018

Я не знаю, есть ли прямой путь в pandas, но вы можете создать функцию для записи вашего определенного формата, а затем использовать groupby и apply, например:

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...