Python 与熊猫一起计数和排序

Python 与熊猫一起计数和排序,python,sorting,pandas,count,group-by,Python,Sorting,Pandas,Count,Group By,我有一个数据框,用于一个文件中的值,通过该文件我按两列进行分组,这两列返回聚合计数。现在我想按最大计数值排序,但是我得到以下错误: KeyError:“计数” 看起来GROUPBY agg count列是某种索引,因此不确定如何执行此操作,我是Python和Panda的初学者。 这是实际代码,如果您需要更多详细信息,请告诉我: def answer_five(): df = census_df#.set_index(['STNAME']) df = df[df['SUMLEV']

我有一个数据框,用于一个文件中的值,通过该文件我按两列进行分组,这两列返回聚合计数。现在我想按最大计数值排序,但是我得到以下错误:

KeyError:“计数”

看起来GROUPBY agg count列是某种索引,因此不确定如何执行此操作,我是Python和Panda的初学者。 这是实际代码,如果您需要更多详细信息,请告诉我:

def answer_five():
    df = census_df#.set_index(['STNAME'])
    df = df[df['SUMLEV'] == 50]
    df = df[['STNAME','CTYNAME']].groupby(['STNAME']).agg(['count']).sort(['count'])
    #df.set_index(['count'])
    print(df.index)
    # get sorted count max item
    return df.head(5)

我认为您需要添加
reset_index
,然后将参数
ascending=False
添加到,因为
排序
返回:

FutureWarning:sort(columns=..)已弃用,请使用sort_值(by=..) .sort_值(['count'],升序=False)

样本:

df = pd.DataFrame({'STNAME':list('abscscbcdbcsscae'),
                   'CTYNAME':[4,5,6,5,6,2,3,4,5,6,4,5,4,3,6,5]})

print (df)
    CTYNAME STNAME
0         4      a
1         5      b
2         6      s
3         5      c
4         6      s
5         2      c
6         3      b
7         4      c
8         5      d
9         6      b
10        4      c
11        5      s
12        4      s
13        3      c
14        6      a
15        5      e

df = df[['STNAME','CTYNAME']].groupby(['STNAME'])['CTYNAME'] \
                             .count() \
                             .reset_index(name='count') \
                             .sort_values(['count'], ascending=False) \
                             .head(5)

print (df)
  STNAME  count
2      c      5
5      s      4
1      b      3
0      a      2
3      d      1
df = pd.DataFrame({'STNAME':list('abscscbcdbcsscae'),
                   'CTYNAME':[4,5,6,5,6,2,3,4,5,6,4,5,4,3,6,5]})

print (df)
    CTYNAME STNAME
0         4      a
1         5      b
2         6      s
3         5      c
4         6      s
5         2      c
6         3      b
7         4      c
8         5      d
9         6      b
10        4      c
11        5      s
12        4      s
13        3      c
14        6      a
15        5      e

df = df[['STNAME','CTYNAME']].groupby(['STNAME'])['CTYNAME']
                             .size()
                             .nlargest(5)
                             .reset_index(name='top5')
print (df)
  STNAME  top5
0      c     5
1      s     4
2      b     3
3      a     2
4      d     1

但似乎你需要:

或:

size
count
之间的区别是:

计数
NaN
值,不计算

样本:

df = pd.DataFrame({'STNAME':list('abscscbcdbcsscae'),
                   'CTYNAME':[4,5,6,5,6,2,3,4,5,6,4,5,4,3,6,5]})

print (df)
    CTYNAME STNAME
0         4      a
1         5      b
2         6      s
3         5      c
4         6      s
5         2      c
6         3      b
7         4      c
8         5      d
9         6      b
10        4      c
11        5      s
12        4      s
13        3      c
14        6      a
15        5      e

df = df[['STNAME','CTYNAME']].groupby(['STNAME'])['CTYNAME'] \
                             .count() \
                             .reset_index(name='count') \
                             .sort_values(['count'], ascending=False) \
                             .head(5)

print (df)
  STNAME  count
2      c      5
5      s      4
1      b      3
0      a      2
3      d      1
df = pd.DataFrame({'STNAME':list('abscscbcdbcsscae'),
                   'CTYNAME':[4,5,6,5,6,2,3,4,5,6,4,5,4,3,6,5]})

print (df)
    CTYNAME STNAME
0         4      a
1         5      b
2         6      s
3         5      c
4         6      s
5         2      c
6         3      b
7         4      c
8         5      d
9         6      b
10        4      c
11        5      s
12        4      s
13        3      c
14        6      a
15        5      e

df = df[['STNAME','CTYNAME']].groupby(['STNAME'])['CTYNAME']
                             .size()
                             .nlargest(5)
                             .reset_index(name='top5')
print (df)
  STNAME  top5
0      c     5
1      s     4
2      b     3
3      a     2
4      d     1

我不知道你的df到底是什么样子。但如果必须按计数对几个类别的频率进行排序,则更容易从df中切片一个系列并对系列进行排序:

series = df.count().sort_values(ascending=False)
series.head()

请注意,本系列将使用类别名称作为索引

我同意@Christoph Schranz从数据帧中获取一系列片段

df[['STNAME','CTYNAME']].groupby('STNAME')['CTYNAME'].count().nlargest(3)

@7月-请随意忽略它,因为在使用Series而不是DataFrame的数据中,我正在尝试使用Series并获取
TypeError:set_index()得到一个意外的关键字参数'name'
@jul-so
print(type(df['STNAME','CTYNAME'].groupby(['STNAME'])['CTYNAME'].size().nlargest(5))
return
Series
df.groupby('track\u id').size().reset\u index(name='count').sort\u value('count',升序=False)
有效。我得到了错误:
TypeError:set\u index()得到了一个意外的关键字参数'name'
。以下内容对我有效(通过差异数据和概率):
df[[col1,col2]].groupby(col1.count().sort_值(col2,升序=False)
df[['STNAME','CTYNAME']].groupby('STNAME')['CTYNAME'].count().nlargest(3)