如何在Python Pandas中分组统计、排序并获取Top10演员(按账号数)
解决Pandas按演员分组统计账号数并取Top10的问题
我来帮你修正这个问题~你原来的代码逻辑有点搞反了,咱们一步步来实现你要的效果,对应你给出的SQL逻辑:SELECT actor_id, COUNT(account_id) FROM table GROUP BY actor_id ORDER BY COUNT(account_id) DESC LIMIT 10,用Pandas可以这么做:
步骤1:分组统计每个演员的账号数量
首先通过groupby按actor_id分组,然后对account_id计数(因为一个演员可能关联多个账号,计数就能得到每个演员的账号总数):
# 分组统计,得到每个actor_id对应的账号数 account_count = df.groupby('actor_id')['account_id'].count().reset_index(name='account_num')
这里reset_index(name='account_num')是把分组后的索引(actor_id)转成列,同时给计数列起个清晰的名字account_num,方便后续操作。
步骤2:按账号数降序排序并取Top10
接下来对统计结果按account_num降序排列,然后取前10条:
# 降序排序,取账号最多的Top10演员 top10_actors = account_count.sort_values(by='account_num', ascending=False).head(10)
完整代码示例
把两步合起来,完整可运行的代码如下:
# 分组统计每个演员的账号数量 account_count = df.groupby('actor_id')['account_id'].count().reset_index(name='account_num') # 按账号数降序排序,取Top10 top10_actors = account_count.sort_values(by='account_num', ascending=False).head(10) print(top10_actors)
为什么你的原代码不对?
你原来的代码:
df['count'] = df['actor_id'].map(df['account_id'].value_counts()) df.sort_index('count', ascending=False)
这里的核心问题是逻辑颠倒了:df['account_id'].value_counts()统计的是每个账号被关联的演员次数,而非每个演员拥有的账号数,再用actor_id去映射这个结果,自然得不到你想要的统计数据。
如果你想直接在原DataFrame里添加计数列,也可以用这种方式:
# 先统计每个actor_id的账号数并命名列 actor_account_count = df.groupby('actor_id')['account_id'].count().rename('account_num') # 把计数列合并回原DataFrame df_with_count = df.merge(actor_account_count, on='actor_id', how='left') # 去重(每个演员只保留一行)后排序取Top10 top10_actors = df_with_count.drop_duplicates('actor_id').sort_values(by='account_num', ascending=False).head(10)
内容的提问来源于stack exchange,提问作者kaecvtionr
相关产品推荐
相关产品推荐

