从groupby对象创建字典,Python

17 投票
2 回答
23272 浏览
提问于 2025-04-18 05:24

假设我有一个数据表:

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']。注意,出现频率高的名字应该在值列表排在前面

期望的输出:

dict1 = { 'Bird':['Pigeon','Flappy Bird'] , 'Pokemon':['Jerry','Mudkip'] }

2 个回答

13

这是一个简单的一行代码。

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}}
15

你可以用一种叫做字典推导的方法来创建字典,下面是示例代码:

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 进行排序,这样才能得到你想要的顺序。

撰写回答