分组并找到前n个value_counts pandas

时间:2016-02-12 14:06:47

标签: python pandas dataframe

我有一个出租车数据的数据框,有两列,如下所示:

Neighborhood    Borough        Time
Midtown         Manhattan      X
Melrose         Bronx          Y
Grant City      Staten Island  Z
Midtown         Manhattan      A
Lincoln Square  Manhattan      B

基本上,每行代表该行政区附近的出租车。现在,我想在每个行政区找到前5个街区,拥有最多的皮卡。我试过这个:

df['Neighborhood'].groupby(df['Borough']).value_counts()

这给了我这样的东西:

borough                          
Bronx          High  Bridge          3424
               Mott Haven            2515
               Concourse Village     1443
               Port Morris           1153
               Melrose                492
               North Riverdale        463
               Eastchester            434
               Concourse              395
               Fordham                252
               Wakefield              214
               Kingsbridge            212
               Mount Hope             200
               Parkchester            191
......

Staten Island  Castleton Corners        4
               Dongan Hills             4
               Eltingville              4
               Graniteville             4
               Great Kills              4
               Castleton                3
               Woodrow                  1

如何过滤它以便我只获得前5个?我知道有几个问题有类似的标题,但它们对我的情况没有帮助。

6 个答案:

答案 0 :(得分:22)

我认为您可以使用nlargest - 您可以将1更改为5

s = df['Neighborhood'].groupby(df['Borough']).value_counts()
print s
Borough                      
Bronx          Melrose            7
Manhattan      Midtown           12
               Lincoln Square     2
Staten Island  Grant City        11
dtype: int64

print s.groupby(level=[0,1]).nlargest(1)
Bronx          Bronx          Melrose        7
Manhattan      Manhattan      Midtown       12
Staten Island  Staten Island  Grant City    11
dtype: int64

正在创建其他列,指定级别信息

答案 1 :(得分:10)

您可以通过稍微扩展您的原始群组来实现这一目标:' nlargest':

>>> df.groupby(['Borough', 'Neighborhood']).Neighborhood.value_counts().nlargest(5)
Borough        Neighborhood    Neighborhood  
Bronx          Melrose         Melrose           1
Manhattan      Midtown         Midtown           1
Manhatten      Lincoln Square  Lincoln Square    1
               Midtown         Midtown           1
Staten Island  Grant City      Grant City        1
dtype: int64

答案 2 :(得分:0)

df ['Neighborhood']。groupby(df ['Borough'])。value_counts()。head(5)

head()获取数据帧中的前5行。

答案 3 :(得分:0)

您也可以尝试下面的代码,仅获取价值计数的前10个值

“国家/地区代码”和“ raised_amount_usd”是列名。

groupby_country_code = master_frame.groupby('country_code') arr = groupby_country_code ['raised_amount_usd']。sum()。sort_index()[0:10] 打印(arr)

[0:10]显示数组中要切片的索引0到10。您可以选择切片选项。

答案 4 :(得分:0)

试试这个(只需将 head() 中的数字更改为您的选择):

# top 3 : total counts of 'Neighborhood' in each Borough
Z = df.groupby('Borough')['Neighborhood'].value_counts().groupby(level=0).head(3).sort_values(ascending=False).to_frame('counts').reset_index()

Z

答案 5 :(得分:0)

解决方案:

df.groupby(['Borough']).Neighborhood.value_counts().groupby(level=0, group_keys=False).head(5)
  1. .value_counts().nlargest(5) 只给你一组前 5 名
  2. group_keys=False 避免重复索引
  3. 因为value_counts()已经排序,只需要head(5)