преобразовать df в определенный словарь dictionary в pandas

#python-3.x #pandas #dataframe #dictionary

#python-3.x #pandas #фрейм данных #словарь

Вопрос:

У меня есть df, как показано ниже

 Params                       Value
teachers                        49
students                       289
R                              3.7
holidays                       165
OS                              18
Em_from   2020-02-29T20:00:00.000Z
Em_to     2020-03-20T20:00:00.000Z
Em_F                             3
Em_C                             2
sC_from   2020-03-31T20:00:00.000Z
sC_to     2020-05-29T20:00:00.000Z
sC_F                            25
sC_C                            31
  

Из приведенного выше df я хотел бы преобразовать его в словарь dictionary, как показано ниже.

dict:

 {'teachers': 49, 
 'students': 289,  
 'R': 3.7, 
 'holidays': 165,
 'OS':18,
 'Em': {'from': '2020-02-29T20:00:00.000Z', 'to': '2020-03-20T20:00:00.000Z', 
       'F': 3, 'C': 2},
 'sC': {'from': '2020-03-31T20:00:00.000Z', 'to': '2020-05-29T20:00:00.000Z', 
        'F': 25, 'C': 31}}
  

Ответ №1:

Использовать:

 s = df['Params'].str.split('_')
m = s.str.len().eq(1)

d1 = df[m].set_index('Params')['Value'].to_dict()
d2 = df[~m].assign(Params=s.str[-1]).agg(tuple, axis=1)
           .groupby(s.str[0]).agg(lambda s: dict(s.tolist())).to_dict()

dct = {**d1, **d2}
  

Результат:

 {'Em': {'C': '2',
        'F': '3',
        'from': '2020-02-29T20:00:00.000Z',
        'to': '2020-03-20T20:00:00.000Z'},
 'OS': '18',
 'R': '3.7',
 'holidays': '165',
 'sC': {'C': '31',
        'F': '25',
        'from': '2020-03-31T20:00:00.000Z',
        'to': '2020-05-29T20:00:00.000Z'},
 'students': '289',
 'teachers': '49'}
  

Ответ №2:

Пожалуйста, всегда старайтесь предоставлять данные воспроизводимым способом, больше людей смогут задать этот вопрос

Набор данных

 Params = ['teachers','students','R','holidays','OS','Em_from','Em_to','Em_F','Em_C','sC_from','sC_to','sC_F','sC_C']                       

Value = ['49','289','3.7','165','18','2020-02-29T20:00:00.000Z','2020-03-20T20:00:00.000Z','3','2','2020-03-31T20:00:00.000Z','2020-05-29T20:00:00.000Z','25','31']

df = pd.DataFrame(zip(Params,Value),columns=["col1","col2"])
  

вы можете сделать что-то вроде

 d = {}
for lst in df.values:
    for k,v in zip(lst[0:],lst[1:]):
        if any(name in k for name in ('Em_from', 'sC_from')):d[k.split('_')[0]] = {k.split('_')[1]:v}
        elif any(name in k for name in ('Em_to', 'Em_F','Em_C','sC_to','sC_F','sC_C')):d[k.split('_')[0]][k.split('_')[1]] = v
        else:d[k] = v
  

Вывод

 {'teachers': '49',
 'students': '289',
 'R': '3.7',
 'holidays': '165',
 'OS': '18',
 'Em': {'from': '2020-02-29T20:00:00.000Z',
  'to': '2020-03-20T20:00:00.000Z',
  'F': '3',
  'C': '2'},
 'sC': {'from': '2020-03-31T20:00:00.000Z',
  'to': '2020-05-29T20:00:00.000Z',
  'F': '25',
  'C': '31'}}
  

Ответ №3:

фреймы данных panda имеют метод to_json (см. Документы)

Там есть несколько примеров, но общий поток выглядит следующим образом, допустим, у вас есть фрейм данных с именем df :

 import json
import pandas as pd

parsed = df.to_json()
df_json = json.loads(json_df)
  

Прочитайте документы, чтобы увидеть больше примеров и различных параметров, с которыми вам, возможно, придется повозиться.