【问题标题】:Pandas dataframe groups to nested dict熊猫数据框组到嵌套字典
【发布时间】:2022-01-11 00:53:03
【问题描述】:

我有一个数据框(如下),我需要将其转换为 PERSON_ID 的嵌套字典,然后是 YEAR。我已经能够做到这一点;

frame = frame.T.to_dict('dict')

但不幸的是,我需要这样的结构;

{76129: {1951: 'IN': 3.77551684175021, 'OUT': 6.02818626979883,
         1952: 'IN': 3.67945267132245, 'OUT': 1.7685974058508,
         1953: 'IN': 3.53030183426851, 'OUT': 0.409577500579766}}

如果有人对如何解决此问题有任何想法,我将不胜感激。

PERSON_ID YEAR IN OUT
0 76129 1951 3.77551684175021 6.02818626979883
1 76224 1951 9.3791597299824 9.53608578598666
2 76250 1951 0.729347478193212 5.74296130666972
3 76322 1951 0.922030969294425 8.95933733613574
4 76129 1952 3.67945267132245 1.7685974058508
5 76224 1952 2.43404429471111 7.97540821827656
6 76250 1952 7.26162056498856 9.76505935514356
7 76322 1952 8.66970822529531 7.50026191441197
8 76129 1953 3.53030183426851 0.409577500579766
9 76224 1953 3.45390554224515 3.20774562896629
10 76250 1953 6.63976713572943 5.48027529875715
11 76322 1953 7.87048287939222 0.610433799575476

【问题讨论】:

  • 如果您只是尝试导出 JSON,请参阅现有的 JSON 问题。你真的在内部真的需要这个嵌套的字典吗?似乎不太可能。如果是,您能解释一下原因吗?
  • 您想要的输出不是有效的嵌套字典 (invalid syntax)。您能否确认所需的输出应该是什么?
  • @Bill:缺少尾随 '}}'
  • Nick:您是否只想导出 JSON?如果是,这是Convert Pandas DataFrame to JSON format 的副本。 (熊猫本身也有一个df.to_json(),但它不够灵活,无法创建您想要的嵌套字典/分组。)
  • @smci 即使现在添加了尾随'}}',这仍然不是有效的字典。当我尝试它时,我得到SyntaxError: invalid syntax

标签: python pandas


【解决方案1】:

假设您确实想要这样的嵌套字典(注意额外的大括号):

{76129: {1951: {'IN': 3.77551684175021, 'OUT': 6.02818626979883},
         1952: {'IN': 3.67945267132245, 'OUT': 1.7685974058508},
         1953: {'IN': 3.53030183426851, 'OUT': 0.409577500579766}},
 ... etc.
}

这是一个循序渐进的方法。

首先,使用所需的 (PERSON_ID, YEAR) 多索引创建一个数据框:

frame_sorted = frame.set_index(['PERSON_ID', 'YEAR']).sort_index()
print(frame_sorted)

输出:

                      IN       OUT
PERSON_ID YEAR                    
76129     1951  3.775517  6.028186
          1952  3.679453  1.768597
          1953  3.530302  0.409578
... etc.

然后,使用嵌套字典理解创建嵌套字典:

person_ids = frame_sorted.index.levels[0]
data_dict = {person: {idx: data.to_dict() for idx, data in frame_sorted.loc[person].iterrows()}
             for person in person_ids}
print(data_dict)

输出

{76129: {1951: {'IN': 3.77551684175021, 'OUT': 6.02818626979883},
  1952: {'IN': 3.67945267132245, 'OUT': 1.7685974058508},
  1953: {'IN': 3.53030183426851, 'OUT': 0.409577500579766}},
 ...etc.

【讨论】:

    【解决方案2】:

    我们需要先设置 index ,然后加上 groupby to_dict 以创建多级 dict

    d = df.set_index('YEAR').groupby('PERSON_ID').apply(lambda x : x.drop('PERSON_ID',axis = 1).to_dict('index')).to_dict()
    

    样本输出

    d[76129]
    {1951: {'IN': 3.77551684175021, 'OUT': 6.02818626979883}, 1952: {'IN': 3.67945267132245, 'OUT': 1.7685974058508}, 1953: {'IN': 3.53030183426851, 'OUT': 0.409577500579766}}
    

    【讨论】:

    • 如果 OP 只想导出 JSON,这是许多现有问题的重复。
    猜你喜欢
    • 2023-03-23
    • 2018-04-14
    • 1970-01-01
    • 2021-02-15
    • 2019-03-26
    • 2016-11-11
    • 1970-01-01
    • 2022-11-17
    相关资源
    最近更新 更多