【问题标题】:Create dictionaries from pandas dataframe based on colums values根据列值从 pandas 数据框创建字典
【发布时间】:2019-02-14 01:02:20
【问题描述】:

根据列值从 pandas 数据框创建多个字典的最佳方法是什么?

我的数据框格式如下:

    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)的evtnum字典,计算每个事件中每个字母的出现次数以及该字母在该事件中能量的平均值。像这样的:

 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]  
             ...
          }

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

【问题讨论】:

    标签: python pandas dictionary


    【解决方案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}}
    

    【讨论】:

    • 太棒了!我绝对不会想到这样做。非常感谢。
    • 嗨@Jorge,一个问题:然后我想对具有相同键的不同字典中的值求和,所以我使用 from collections import Counter 然后例如: col_1 = Counter(eval(df_1) ), col_2 = 计数器(eval(df_2))。如果然后我尝试: sum_dicts = col_1 + col_2 我得到这个错误: newcount = count + other[elem] TypeError: unsupported operand type(s) for +: 'dict' and 'dict'。你知道为什么会这样以及如何解决吗?再次感谢
    • @Laura 我不确定你想要达到什么目的。似乎您可以在原始数据帧上使用 groupby 来实现您需要的,而无需访问字典。你试过吗?
    • 我没有尝试,因为我必须在创建字典时添加更多信息。在这里,我用新问题发布了我的问题的更新:stackoverflow.com/questions/54727463/… 谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-07-03
    • 2017-04-10
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 2016-05-12
    • 2018-08-25
    • 2018-12-24
    相关资源
    最近更新 更多