从 groupby 对象创建字典,Python
Posted
技术标签:
【中文标题】从 groupby 对象创建字典,Python【英文标题】:Create a dictionary from groupby object,Python 【发布时间】:2014-06-21 15:15:03 【问题描述】:假设我有一个数据框:
df = pd.DataFrame('Type' : ['Pokemon', 'Pokemon', 'Bird', 'Pokemon', 'Bird', 'Pokemon', 'Pokemon', 'Bird'],'Name' : ['Jerry', 'Jerry', 'Flappy Bird', 'Mudkip','Pigeon', 'Mudkip', 'Jerry', 'Pigeon'])
我根据类型对其进行分组:
print df.groupby(['Type','Name'])['Type'].agg('Frequency':'count')
Frequency
Type Name
Bird Flappy Bird 1
Pigeon 2
Pokemon Jerry 3
Mudkip 2
我可以从上面的组中创建一个字典吗? 键 "Bird"
将有一个包含['Pigeon',Flappy Bird']
的列表值,注意高频名称应该出现在值中first列表。
预期输出:
dict1 = 'Bird':['Pigeon','Flappy Bird'] , 'Pokemon':['Jerry','Mudkip']
【问题讨论】:
【参考方案1】:您可以使用以下字典推导式创建字典
df = pd.DataFrame('Type' : ['Pokemon', 'Pokemon', 'Bird', 'Pokemon', 'Bird', 'Pokemon', 'Pokemon', 'Bird'],'Name' : ['Jerry', 'Jerry', 'Flappy Bird', 'Mudkip','Pigeon', 'Mudkip', 'Jerry', 'Pigeon'])
f = df.groupby(['Type','Name'])['Type'].agg('Frequency':'count')
f.sort('Frequency',ascending=False, inplace=True)
d = k:list(f.ix[k].index) for k in f.index.levels[0]
print(d)
# 'Bird': ['Pigeon', 'Flappy Bird'], 'Pokemon': ['Jerry', 'Mudkip']
字典理解将遍历外部索引('Bird'、'Pokemon'),然后将值设置为字典的内部索引。
必须先按Frequency
列对您的MultiIndex
进行排序以获得您想要的排序。
【讨论】:
DataFrame.sort()
已被弃用,现在已被删除。立即使用f.sort_values()
。【参考方案2】:
这是一个单线。
df.groupby(['Type'])['Name'].apply(lambda grp: list(grp.value_counts().index)).to_dict()
# output
#'Bird': ['Pigeon', 'Flappy Bird'], 'Pokemon': ['Jerry', 'Mudkip']
value_counts
函数默认按计数对Name
字段进行分组,并默认返回降序。
奖励:如果您想包含计数,可以执行以下操作。
df.groupby(['Type']).apply(lambda grp: grp.groupby('Name')['Type'].count().to_dict()).to_dict()
# 'Bird': 'Flappy Bird': 1, 'Pigeon': 2, 'Pokemon': 'Jerry': 3, 'Mudkip': 2
【讨论】:
嗨@DanDy:你的奖金部分帮助了我。你能详细说明一下吗,我想知道它是如何工作的。谢谢..以上是关于从 groupby 对象创建字典,Python的主要内容,如果未能解决你的问题,请参考以下文章
将 GroupBy 对象 (groupby().size) 转换为字典