Преобразовать мультииндексный Pandas кадр данных в JSON - PullRequest
0 голосов
/ 30 марта 2020

Рассмотрим Pandas DataFrame с MultiIndex:

                    virtual_device_135 virtual_device_136
                              tag_5764           tag_5764
timestamp                                                
31/03/2020 02:10:30              -0.97                NaN
31/03/2020 02:10:35                NaN               0.98
31/03/2020 02:10:40              -0.97                NaN
31/03/2020 02:10:45                NaN              -0.98
31/03/2020 02:10:50              -0.97                NaN

Вышеуказанное DataFrame необходимо преобразовать в json, который выглядит следующим образом:

bodyContent": [
        {
          "time": "31/03/2020 02:17:01",
          "tag_5764_virtual_device_135": -0.97
        },
        {
          "time": "31/03/2020 02:17:12",
          "tag_5764_virtual_device_135": -0.97
        },
        {
          "time": "31/03/2020 02:17:22",
          "tag_5764_virtual_device_135": -0.97
        },
        {
          "time": "31/03/2020 02:18:37",
          "tag_5764_virtual_device_136": -0.98
        },
        {
          "time": "31/03/2020 02:18:47",
          "tag_5764_virtual_device_136": -0.98
        },
        {
          "time": "31/03/2020 02:18:57",
          "tag_5764_virtual_device_136": -0.98
        }
]

В настоящее время я разделяю DF, затем переименовываю столбец, затем объединяю его и затем преобразую в json.

Есть ли лучший способ в Pandas, который я могу использовать?

Любая помощь приветствуется!

Ответы [ 2 ]

0 голосов
/ 31 марта 2020
df.columns = ['_'.join(col[::-1]) for col in df.columns]
df = df.reset_index().rename(columns = {'timestamp': 'time'})
jsonbody = list({k: {k1:v1 for k1,v1 in v.items() if pd.notnull(v1)} \
           for k, v in df.to_dict(orient= 'index').items()}.values())
0 голосов
/ 31 марта 2020

Я обнаружил, что это можно сделать следующим образом:

Если DataFrame - это df:

df.columns = ['_'.join(col) for col in df.columns]
df.reset_index(inplace=True)

df_list = json.loads(df.to_json(orient='records'))

for each in df_list:
    body_content_list.append(each)

Надеюсь, это кому-нибудь пригодится.

...