pandas - 在分组数据框中显示 N 个最高计数

pandas - show N highest counts in a group-by dataframe

这是我的输入 DataFrame

df = pd.DataFrame([
 ['CA', 'LAX', 'Alice'],
 ['NY', 'NYC', 'Alice'],
 ['TX', 'HOU', 'Alice'],
 ['CA', 'SFO', 'Bob'], 
 ['NY', 'NYC', 'Bob'],
 ['TX', 'AUS', 'Bob'], 
 ['CA', 'LAX', 'Carol'],
 ['NY', 'ALB', 'Carol'], 
 ['TX', 'HOU', 'Carol'],
 ['CA', 'LAX', 'Dan'],
 ['NY', 'NYC', 'Dan'],
 ['TX', 'DAL', 'Dan'],
 ['CA', 'SFO', 'Eve'],
 ['NY', 'NYC', 'Eve'],
 ['TX', 'AUS', 'Eve'], 
 ['CA', 'SDO', 'Frank'],
 ['NY', 'NYC', 'Frank'],
 ['TX', 'HOU', 'Frank']], 
 columns=['State','City','Person']) 

这是我希望得到的输出:

State City  Count       
CA    LAX    3
      SFO    2
NY    ALB    1
      NYC    5
TX    HOU    3
      AUS    2

基本上,我想显示每个州人口最多的前 2 个城市。

我试过使用这个 groupby 语句: df.groupby(['State','City'])['Person'].count()

生成以下输出

State  City         
CA     LAX    3
       SDO    1
       SFO    2
NY     ALB    1
       NYC    5
TX     AUS    2
       DAL    1
       HOU    3

但我无法提出可以对上述计数进行排序并选择最高的两个计数的语句。非常感谢您的帮助!

你的第一个 groupby 是正确的,之后你想根据 State 和 Count 对你的值进行排序。

然后你再次单独分组并获取 head(2)。如果需要,您可以(重新)将索引设置为州和城市。

df2 = df.groupby(['State','City'])['Person'].count().to_frame('Count')
df2 = df2.reset_index().sort_values(['State', 'Count'], ascending=[True, False])

df2.groupby('State').head(2).set_index(['State','City'])

输出:

                Count
State   City    
CA      LAX     3
        SFO     2
NY      NYC     5
        ALB     1
TX      HOU     3
        AUS     2

我认为你可以简化方法。

您可以使用 groupby.value_counts() 而不是 count() 来获取您所在的位置,然后链接另一个 groupby().head(2) 以获得每个州的前 2 个城市。

原因是value_counts()结果对象会按descending顺序排列,所以第一个元素是最常出现的元素,所以可以用head(2)作为它是。

df.groupby('State')['City'].value_counts().groupby('State').head(2)

State  City
CA     LAX     3
       SFO     2
NY     NYC     5
       ALB     1
TX     HOU     3
       AUS     2
Name: City, dtype: int64