如何通过Pandas GroupBy和value_counts获取各区域Top N常见值
解决每个区域取Top N高频犯罪类型的问题
问题背景
你有如下的犯罪记录表格:
| Area Name | Code Description |
|---|---|
| N Hollywood | VIOLATION OF RESTRAINING ORDER |
| N Hollywood | CRIMINAL THREATS - NO WEAPON DISPLAYED |
| N Hollywood | CRIMINAL THREATS - NO WEAPON DISPLAYED |
| N Hollywood | ASSAULT WITH DEADLY WEAPON, AGGRAVATED ASSAULT |
| Southeast | ASSAULT WITH DEADLY WEAPON, AGGRAVATED ASSAULT |
| West Valley | CRIMINAL THREATS - NO WEAPON DISPLAYED |
| West Valley | CRIMINAL THREATS - NO WEAPON DISPLAYED |
| 77th Street | RAPE, FORCIBLE |
| Foothill | CRM AGNST CHLD (13 OR UNDER) (14-15 & SUSP 10 YRS OLDER)0060 |
| N Hollywood | VANDALISM - FELONY ($400 & OVER, ALL CHURCH VANDALISMS) 0114 |
你用df.groupby(['Area Name'])['Code Description'].value_counts()统计了每个区域各犯罪类型的频次,但直接追加.nlargest(3)只会返回全局频次最高的3项(单个区域的结果),而不是每个区域自己的Top N项。
解决方案
问题的核心是:value_counts()返回的是一个多级索引的Series(第一级是区域名,第二级是犯罪类型),直接用.nlargest(3)是对整个Series全局排序取前3,而不是按区域分组后每组取前N。
要实现每个区域单独取Top N高频项,你需要再嵌套一次groupby,对每个区域组应用取前N的操作。有两种简洁的方式:
方法1:使用apply + nlargest
# 取每个区域的Top 2高频项,可替换2为你需要的N值 df.groupby(['Area Name'])['Code Description'].value_counts()\ .groupby(level=0)\ .apply(lambda x: x.nlargest(2))
方法2:使用head(更高效)
因为value_counts()本身已经按频次降序排列了,所以直接用head(N)取每个组的前N项即可:
# 同样替换2为你需要的N值 df.groupby(['Area Name'])['Code Description'].value_counts()\ .groupby(level=0)\ .head(2)
示例结果
用你的数据运行上述代码(取Top2),会得到如下结果:
Area Name Code Description N Hollywood CRIMINAL THREATS - NO WEAPON DISPLAYED 2 ASSAULT WITH DEADLY WEAPON, AGGRAVATED ASSAULT 1 West Valley CRIMINAL THREATS - NO WEAPON DISPLAYED 2 77th Street RAPE, FORCIBLE 1 Foothill CRM AGNST CHLD (13 OR UNDER) (14-15 & SUSP 10 YRS OLDER)0060 1 Southeast ASSAULT WITH DEADLY WEAPON, AGGRAVATED ASSAULT 1 Name: Code Description, dtype: int64
可以看到,每个区域的Top N项都被正确提取出来了,如果某个区域的犯罪类型不足N个,会显示所有已有的项。
内容的提问来源于stack exchange,提问作者Patty Jula
相关产品推荐
相关产品推荐

