【问题标题】:Pandas GroupBy : How to get top n values based on a columnPandas GroupBy:如何根据列获取前 n 个值
【发布时间】:2016-03-12 08:30:41
【问题描述】:

如果这是一个基本问题,请原谅我,但我是熊猫新手。我有一个带有 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 在 group by 的结果中看到的?我错过了什么?

更新

考虑

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 列中具有最大计数的行。

更新2

我做到了

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 个条目。在我的情况下,列 B 和 C 是唯一的。这很好。现在我如何获得 C 列的前 n 行?

更新3

所以我尝试了

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

我明白了

[151, 85, 72]

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

【问题讨论】:

  • 请发布原始输入数据、代码以重现您的 df,目前这一切都是推测性的,没有数据和代码来重现您的观察结果
  • 我认为downvote是因为您不使用您的样本数据。
  • 您可以将使用的数据共享到保管箱或谷歌文档吗?因为我尝试使用您的示例数据,但我的输出与您的不同。
  • 不幸的是,这些数据是专有的。顺便说一句,您尝试了什么?您可以将其发布为答案吗?
  • 不,有问题。您可以尝试使用您的示例并通过此输入更改您的输出。最好的是发布您推荐的输出(来自您的示例数据)。

标签: python pandas count group-by dataframe


【解决方案1】:

IIUC 你可以使用函数nlargest。

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

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

【讨论】:

    【解决方案2】:

    我尝试过的一种方法

    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 个值。但肯定有更好的方法来做到这一点?

    【讨论】:

      猜你喜欢
      • 2022-01-17
      • 2019-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      • 1970-01-01
      • 1970-01-01
      • 2018-10-14
      相关资源
      最近更新 更多