【问题标题】:split dataframe into a dictionary of dictionaries将数据框拆分为字典字典
【发布时间】:2021-12-08 12:54:21
【问题描述】:

我有一个包含 4 列的数据框。我想将其中的 2 列用作字典字典的键,其中的值是剩余的 2 列(所以是数据框)

birdies = pd.DataFrame({'Habitat' : ['Captive', 'Wild', 'Captive', 'Wild'],
    'Animal': ['Falcon', 'Falcon','Parrot', 'Parrot'],
                   'Max Speed': [380., 370., 24., 26.],
                  'Color': ["white", "grey", "green", "blue"]})
#this should ouput speed and color
birdies_dict["Falcon"]["Wild"]
#this should contain a dictionary, which the keys are 'Captive','Wild'
birdies_dict["Falcon"]

我找到了一种生成数据框字典的方法,其中单列作为键,而不是两列作为键:

birdies_dict = {k:table for k,table in birdies.groupby("Animal")}

【问题讨论】:

    标签: python-3.x pandas dictionary


    【解决方案1】:

    我建议为此使用defaultdict,解决2列问题的方法是:

    from collections import defaultdict
    d = defaultdict(dict)
    for (hab, ani), _df in df.groupby(['Habitat', 'Animal']):
        d[hab][ani] = _df
    

    这打破了 2 列,如果你想要它具有更高的深度,你可以定义一个递归的 defaultdict:

    from collections import defaultdict
    recursive_dict = lambda: defaultdict(recursive_dict)
    dct = recursive_dict()
    dct[1][2][3] = ...
    

    【讨论】:

      【解决方案2】:

      to_dict 传递到内部:

      birdies_dict = {k:d.to_dict() for k,d in birdies.groupby('Animal')}
      birdies_dict['Falcon']['Habitat']
      

      输出:

      {0: 'Captive', 1: 'Wild'}
      

      或者你的意思是:

      out = birdies.set_index(['Animal','Habitat'])
      out.loc[('Falcon','Captive')]
      

      给出:

      Max Speed      380
      Color        white
      Name: (Falcon, Captive), dtype: object
      

      【讨论】:

      • 这是使用索引,但我需要它是字典的形式。
      【解决方案3】:

      IIUC:

      birdies_dict = {k:{habitat: table[['Max Speed', 'Color']].to_numpy() for habitat in table['Habitat'].to_numpy()} for k,table in birdies.groupby("Animal")}
      

      birdies_dict = {k:{habitat: table[['Max Speed', 'Color']] for habitat in table['Habitat'].to_numpy()} for k,table in birdies.groupby("Animal")}
      #In this case inner key will have a dataframe
      

      birdies_dict = {k:{inner_key: inner_table for inner_key, inner_table in table.groupby('Habitat')} for k,table in birdies.groupby("Animal")}
      

      【讨论】:

      • 内键应该是第二列,而不是“栖息地”,我编辑了问题,很抱歉造成混乱
      • 检查编辑后的答案
      • 这确实是对这个非常具体的数据框的答案,但我正在寻找的是一个概括,类似于单列键的解决方案
      • 对不起,我没听明白,similar to the solution of a single column key 是什么意思
      • 这个 sn-p 创建一个数据帧字典,使用列 'animal' 作为键,birdies_dict = {k:table for k,table in birdies.groupby("Animal")} 我正在寻找一个类似的构造,但有 2 列作为键,这与结构无关数据框的
      猜你喜欢
      • 2015-04-04
      • 2017-11-27
      • 2021-09-09
      • 1970-01-01
      • 2022-07-05
      • 2010-12-19
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多