Python 3.x 将df转换为特定的熊猫词典
我有一个df,如下所示Python 3.x 将df转换为特定的熊猫词典,python-3.x,pandas,dataframe,dictionary,Python 3.x,Pandas,Dataframe,Dictionary,我有一个df,如下所示 Params Value teachers 49 students 289 R 3.7 holidays 165 OS 18 Em_from 2020-02-29T20:00:0
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,我想将其转换为字典的字典,如下所示
格言:
panda的数据帧有一个to_json方法 这里有多个示例,但一般流程是这样的,假设您有一个名为
df
的数据帧:
import json
import pandas as pd
parsed = df.to_json()
df_json = json.loads(json_df)
阅读文档以查看更多示例和可能需要修改的不同参数。使用:
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'}
请始终尝试以可复制的方式提供数据,更多的人将能够尝试这个问题 数据集
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"])
{'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'}}
你可以这样做
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
输出
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"])
{'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'}}