根据列值从熊猫数据框创建字典

时间:2019-02-14 01:02:21

标签: python pandas dictionary

哪种是基于列值从熊猫数据框中创建多个字典的最佳方法?

我的数据框具有以下格式:

    evtnum    pcode   energy
1   1         a       20.0
2   1         a       30.0
3   1         b       29.0
4   1         a       34.0
5   2         c       20.0
6   2         a       15.0
7   3         a        3.0
8   3         b        2.0 
9   3         c       25.0
10  4         h       28.0
11  5         a       43.6
12  5         c       20.3

evtnum的取值范围是1到5000,pcode是25个不同的字母。我有一套带这些字母的东西:

pcode_set = [a,b,c,d,h,...]

因此,我想获取每个字母的长度词典(pcode_set),计算每个事件中每个字母的出现次数以及该事件中该能量的平均值。像这样:

 dict_1 = {a : [timesthat"a"appears in evtnum1, 
                energy mean value of a in evtnum1], 
           b : [timesthat"b"appears in evtnum1, 
                energy mean value of b in evtnum1]  
          ...
          }

 dict_2 = {a : [timesthat"a"appears in evtnum2, 
                energy mean value of a in evtnum2], 
           b : [timesthat"b"appears in evtnum2, 
                energy mean value of b in evtnum2]  
          ...
          }
...

 dict_5000 = {a : [timesthat"a"appears in evtnum5000, 
                energy mean value of a in evtnum5000], 
              b : [timesthat"b"appears in evtnum5000, 
                energy mean value of b in evtnum5000]  
             ...
          }

请不要回答我如何计算字母的出现次数或如何计算平均值,这些只是示例。 我只想知道如何创建多个字典并考虑数据框的列值来填充它们。

1 个答案:

答案 0 :(得分:1)

以您的示例为例,此脚本应该可以解决问题:

thismodule = sys.modules[__name__]

df1 = df.groupby(['evtnum', 'pcode']).agg({'pcode':'size', 'energy':'mean'}).rename(columns={'pcode': 'num_pcode',
                                                                                             'energy':'mean_energy'}).reset_index(drop = False)

for evt in df1.evtnum.unique():
    name = 'dict_'+str(evt)
    df_ = df1
    df_ = df_[df_.evtnum==evt].drop('evtnum', 1).set_index('pcode').to_dict('index')
    setattr(thismodule, name, df_)

for number in range(max(df1.reset_index().evtnum.unique())):
    print( number+1)
    print(eval('dict_'+str(number+1)))

打印此内容:

1
{'a': {'num_pcode': 3, 'mean_energy': 28.0}, 'b': {'num_pcode': 1, 'mean_energy': 29.0}}
2
{'a': {'num_pcode': 1, 'mean_energy': 15.0}, 'c': {'num_pcode': 1, 'mean_energy': 20.0}}
3
{'a': {'num_pcode': 1, 'mean_energy': 3.0}, 'b': {'num_pcode': 1, 'mean_energy': 2.0}, 'c': {'num_pcode': 1, 'mean_energy': 25.0}}
4
{'h': {'num_pcode': 1, 'mean_energy': 28.0}}
5
{'a': {'num_pcode': 1, 'mean_energy': 43.6}, 'c': {'num_pcode': 1, 'mean_energy': 20.3}}