2017-07-04 103 views
1

我知道如何将数据框转换为字典,但我不知道如何创建添加了任意键名称的字典。使用新的密钥名称将熊猫数据框转换为字典

假设我有如下的数据框。

raw_data = {'regiment': ['Nighthawks', 'Nighthawks', 'Nighthawks', 'Nighthawks', 'Dragoons', 'Dragoons', 'Dragoons', 'Dragoons', 'Scouts', 'Scouts', 'Scouts', 'Scouts'], 
'company': ['1st', '1st', '2nd', '2nd', '1st', '1st', '2nd', '2nd','1st', '1st', '2nd', '2nd'], 
'name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze', 'Jacon', 'Ryaner', 'Sone', 'Sloan', 'Piger', 'Riani', 'Ali'], 
'preTestScore': [4, 24, 31, 2, 3, 4, 24, 31, 2, 3, 2, 3], 
'postTestScore': [25, 94, 57, 62, 70, 25, 94, 57, 62, 70, 62, 70]} 

df = pd.DataFrame(raw_data, columns = ['regiment', 'company', 'name', 'preTestScore', 'postTestScore']) 

df.head() 
Out[96]: 
    regiment company  name preTestScore postTestScore 
0 Nighthawks  1st Miller    4    25 
1 Nighthawks  1st Jacobson   24    94 
2 Nighthawks  2nd  Ali   31    57 
3 Nighthawks  2nd Milner    2    62 
4 Dragoons  1st  Cooze    3    70 

我想'group''name'并计算'preTestScore'中的最大值,最后创建一个字典,如下所示。

{'Miller': {'maxTestScore': 4}, 
'Jacobson': {'maxTestScore': 24}, ...} 

在这里,我添加了一个新的密钥名称'maxTestScore'。我怎样才能用任意键名实现这一点?提前谢谢你。

回答

2

您可以使用dict comprehensiongroupby

d = {k:{'maxTestScore':v.max()} for k,v in df.groupby('name')['preTestScore']} 
print (d) 

{'Piger': {'maxTestScore': 3}, 
'Milner': {'maxTestScore': 2}, 
'Sone': {'maxTestScore': 31}, 
'Jacon': {'maxTestScore': 4}, 
'Cooze': {'maxTestScore': 3}, 
'Sloan': {'maxTestScore': 2}, 
'Riani': {'maxTestScore': 2}, 
'Miller': {'maxTestScore': 4}, 
'Ali':  {'maxTestScore': 31}, 
'Ryaner': {'maxTestScore': 24}, 
'Jacobson':{'maxTestScore': 24}} 

另一种解决方案:

d = {k:{'maxTestScore':v} for k,v in df.groupby('name')['preTestScore'].max().iteritems()} 
print (d) 

{'Piger': {'maxTestScore': 3}, 
'Milner': {'maxTestScore': 2}, 
'Sone': {'maxTestScore': 31}, 
'Jacon': {'maxTestScore': 4}, 
'Cooze': {'maxTestScore': 3}, 
'Sloan': {'maxTestScore': 2}, 
'Riani': {'maxTestScore': 2}, 
'Miller': {'maxTestScore': 4}, 
'Ali':  {'maxTestScore': 31}, 
'Ryaner': {'maxTestScore': 24}, 
'Jacobson':{'maxTestScore': 24}} 
+0

感谢。这很简单,有效。我选择了第二种解决方案,因为它的长度和清晰度较短 – user4279562

+0

而你是严谨的,第二是更好,所以我换了解决方案。 – jezrael