Python: pandas groupby to dictionary based on index Python:根据索引将pandas groupby转换为字典

2024-09-30 06:29:48 发布

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

df_devices = df.groupby(['from_time', 'device', 'type'])['power'].mean()

在计算列上的groupbymean()之后,我有一个pandas系列包含以下内容

^{pr2}$

我想把它转换成以下格式的词典:

{'00:00:00' : {'AC': {'indoor': 1362.2142857142858, 'outdoor': 3470.705882352941}, 
'Computer': {'indoor': 399.0, 'outdoor': 412.4}, 'Heater': {'indoor': 
2258.375, 'outdoor': 2274.6666666666665}, 'Lights': {'indoor': 1535.0, 
'outdoor': 3475.4736842105262}, 'Microwave': {'indoor': 1420.0, 'outdoor': 
1489.9333333333334}, 'Refridgerator': {'indoor': 192.38888888888889, 
'outdoor': 195.07692307692307}, 'Television': {'indoor': 243.66666666666666, 
'outdoor': 261.5}},
'00:00:01' : {'AC': {'indoor': 1493.0714285714287, 'outdoor': 3724.3529411764707}, 
'Computer': {'indoor': 416.46153846153845, 'outdoor': 413.55555555555554}, 
'Heater': {'indoor': 2143.277777777778, 'outdoor': 2286.4615384615386}, 
'Lights': {'indoor': 1447.95, 'outdoor': 3092.4545454545455}, 'Microwave': 
{'indoor': 1536.857142857143, 'outdoor': 1429.2941176470588}, 
'Refridgerator': {'indoor': 207.41666666666666, 'outdoor': 
234.68421052631578}, 'Television': {'indoor': 251.0, 'outdoor': 
249.9047619047619}}}

我确实尝试过在框架上使用.agg().unstack(),但最终得到了不同的格式 {}也没有给出有希望的结果。它返回不同的格式

我能做的最好的事情就是使用下面的代码

df_devices.unstack(level=2).unstack().to_dict('index')

不提供预期的输出

{'00:00:00': {('indoor', 'AC'): 1362.2142857142858,
('indoor', 'Computer'): 399.0,
('indoor', 'Heater'): 2258.375,
('indoor', 'Lights'): 1535.0,
('indoor', 'Microwave'): 1420.0,
('indoor', 'Refridgerator'): 192.38888888888889,
('indoor', 'Television'): 243.66666666666666,
('outdoor', 'AC'): 3470.705882352941,
('outdoor', 'Computer'): 412.4,
('outdoor', 'Heater'): 2274.6666666666665,
('outdoor', 'Lights'): 3475.4736842105262,
('outdoor', 'Microwave'): 1489.9333333333334,
('outdoor', 'Refridgerator'): 195.07692307692307,
('outdoor', 'Television'): 261.5}

Tags: df格式meanheateraccomputerdevicesgroupby
2条回答

我假设dataframe是逗号分隔的dataframe,并以名称a.csv存储。 下面是一种方法,您可以遍历每一行并从dataframe中形成dict。在

df = pd.read_csv('a.csv')
df.rename(columns={'Unnamed: 3': 'value'}, inplace=True)

from_time = None
device = None
type=None
output = {}
for idx, row in df.iterrows():
    if not pd.isnull(row['from_time']):
        from_time = row['from_time']
    if not pd.isnull(row['device']):
        device = row['device']
    if from_time not in output:
        output[from_time] = {}
    if device not in output[from_time]:
        output[from_time][device] = {}
    output[from_time][device][row['type']] = row['value']

如果你找到比这更好的东西,一定要告诉我。 谢谢。希望有帮助。在

我可以用我创建的相同的dict来解决问题

dicto = df_devices.unstack(level=2).unstack().to_dict('index')

>>> dicto

{'00:00:00': {('indoor', 'AC'): 1362.2142857142858,
('indoor', 'Computer'): 399.0,
('indoor', 'Heater'): 2258.375,
('indoor', 'Lights'): 1535.0,
('indoor', 'Microwave'): 1420.0,
('indoor', 'Refridgerator'): 192.38888888888889,
('indoor', 'Television'): 243.66666666666666,
('outdoor', 'AC'): 3470.705882352941,
('outdoor', 'Computer'): 412.4,
('outdoor', 'Heater'): 2274.6666666666665,
('outdoor', 'Lights'): 3475.4736842105262,
('outdoor', 'Microwave'): 1489.9333333333334,
('outdoor', 'Refridgerator'): 195.07692307692307,
('outdoor', 'Television'): 261.5}

在创建的字典中循环

^{pr2}$

.copy()将创建副本而不是引用

>>> dicto
{'00:00:00': {'AC': {'indoor': 1362.2142857142858,
 'outdoor': 3470.705882352941},
 'Computer': {'indoor': 399.0, 'outdoor': 412.4},
 'Heater': {'indoor': 2258.375, 'outdoor': 2274.6666666666665},
 'Lights': {'indoor': 1535.0, 'outdoor': 3475.4736842105262},
 'Microwave': {'indoor': 1420.0, 'outdoor': 1489.9333333333334},
 'Refridgerator': {'indoor': 192.38888888888889,
 'outdoor': 195.07692307692307},
 'Television': {'indoor': 243.66666666666666, 'outdoor': 261.5}}.........

相关问题 更多 >

    热门问题