Pandas GroupBy:如何根据列

时间:2015-12-07 16:39:05

标签: python pandas count group-by dataframe

如果这是一个基本问题,请原谅我,但我是熊猫新手。我有一个带有A列的数据框,我希望根据A列中的计数获得前n行。例如,原始数据看起来像

A  B  C
x 12  ere
x 34  bfhg
z 6   bgn
z 8   rty
y 567 hmmu,,u
x 545 fghfgj
x 44  zxcbv

请注意,这只是我实际使用的一小部分数据。

因此,如果我们查看A列,则值x出现4次,y出现2次,z出现1次。如何根据此计数获得A列的前n个值?

print df.groupby(['A']).sum()

这给了我

A      B

x      6792117

但是当我做的时候

print len(df.groupby(['A']).get_group('x'))

我得到了

21

此外

len(df.index) 

给了我

23657

那么,如果在分组结果中看到的'A' == 'x'的数量是6792117怎么样?我错过了什么?

更新

考虑

print df.groupby(['A']).describe()

给了我

     Tags           DocID

x    count      21.000000
     mean   323434.142857
     std     35677.410292
     min    266631.000000
     25%    292054.000000
     50%    325575.000000
     75%    347450.000000
     max    380286.000000

这是有道理的。我只想获得按照A列的最大计数行。

UPDATE2

我做了

print df.groupby(['A'],as_index=False).count()

我得到了

         A       B      C
0        x       21     21
1        y       11     11
2        z        8      8

所以基本上,对于A列,标签x在B列中有21个条目,在C列中有21个。在我的情况下,ColumnsB和C是唯一的。这很好。现在我如何得到关于C列的前n行?

UPDATE3

所以我试过

import heapq
print heapq.nlargest(3,df.groupby(['A'],as_index=False).count()['C'])

我得到了

[151, 85, 72]

所以我知道对于A栏,我将上述计数作为前三项计数。但我仍然不知道这些计数指的是A列的哪个值?例如,A列中的哪个值的计数为151?有没有办法链接这些信息?

2 个答案:

答案 0 :(得分:4)

IIUC你可以使用函数nlargest

我尝试了您的示例数据并按列C获得前2行:

print df
   A    B        C
0  x   12      ere
1  x   34     bfhg
2  z    6      bgn
3  z    8      rty
4  y  567  hmmu,,u
5  x  545   fghfgj
6  x   44    zxcbv

dcf = df.groupby(['A'],as_index=False).count()
print dcf
   A  B  C
0  x  4  4
1  y  1  1
2  z  2  2

#get 2 largest rows by column C
print dcf.nlargest(2,'C')
   A  B  C
0  x  4  4
2  z  2  2

答案 1 :(得分:0)

我试过的一种方法

import heapq

dcf =  df.groupby(['A'],as_index=False).count()
print dcf.loc[dcf['C'].isin(heapq.nlargest(5,dcf['C']))].sort(['C'],ascending=False)

给了我

      A       B      C
1664  g       151    151
1887  k       85     85
1533  q       72     72
53    y       68     68
1793  t       62     62

通过

验证
print len(df.loc[df["A"]=="g"])

给了我

151

所以我得到了预期的结果,因为我可以根据A列的计数看到前5个值。但是肯定有更好的方法可以做到这一点吗?