哪种是基于列值从熊猫数据框中创建多个字典的最佳方法?
我的数据框具有以下格式:
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]
...
}
请不要回答我如何计算字母的出现次数或如何计算平均值,这些只是示例。 我只想知道如何创建多个字典并考虑数据框的列值来填充它们。
答案 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}}