【问题标题】:python pandas select top 'n' from multiple sub grouppython pandas从多个子组中选择前'n'
【发布时间】:2018-08-26 06:33:47
【问题描述】:

我有一个 DataFrame,可以说是 3 列:

col1 | col2 | col3
A | x | p
A | x | q
A | x | r
A | x | r
A | y | s
A | y | t
A | z | u
B | x | q
B | x | r
B | y | t

我想按 3 列的唯一组合的出现次数对其进行分组,然后仅选择 col3 的前 2 (n) 个值的记录

因此,如果 (A, x) 的组合在 col3 中有 9 个 p、8 个 q 和 3 个 r - 那么它应该只显示 col3 的前 2 个计数:

A | x | p | 9
A | x | q | 8

我已经尝试过其他论坛的 nlargest、head 和其他一些选项,但它们都不适用于子组 - 它们只显示整个组的前 n 个

【问题讨论】:

  • 您的输出与您的输入不匹配。
  • 我不得不说...我很困惑。

标签: python pandas pandas-groupby


【解决方案1】:

我认为需要groupbyvalue_counts 然后groupby 第一级和第二级使用head

df1 = (df.groupby(['col1','col2'])['col3']
         .value_counts()
         .groupby(level=[0,1])
         .head(2)
         .reset_index(name='count'))
print (df1)
  col1 col2 col3  count
0    A    x    p      9
1    A    x    q      8
2    A    y    s      1
3    A    y    t      1
4    A    z    u      1
5    B    x    q      1
6    B    x    r      1
7    B    y    t      1

详情

print (df.groupby(['col1','col2'])['col3'].value_counts())
col1  col2  col3
A     x     p       9
            q       8
            r       3
      y     s       1
            t       1
      z     u       1
B     x     q       1
            r       1
      y     t       1
Name: col3, dtype: int64

设置

d = {'col1': ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B'], 'col2': ['x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'y', 'y', 'z', 'x', 'x', 'y'], 'col3': ['p', 'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'r', 'r', 'r', 's', 't', 'u', 'q', 'r', 't']}
df = pd.DataFrame(d)
print (df)
   col1 col2 col3
0     A    x    p
1     A    x    p
2     A    x    p
3     A    x    p
4     A    x    p
5     A    x    p
6     A    x    p
7     A    x    p
8     A    x    p
9     A    x    q
10    A    x    q
11    A    x    q
12    A    x    q
13    A    x    q
14    A    x    q
15    A    x    q
16    A    x    q
17    A    x    r
18    A    x    r
19    A    x    r
20    A    y    s
21    A    y    t
22    A    z    u
23    B    x    q
24    B    x    r
25    B    y    t

【讨论】:

  • 我也试过了,但这也显示了组组合的前 2 个,而不是子组的计数
  • @Ritu - 我添加输入数据框,df (A, x) has 9 counts of p 表示 9 rows A,x,p ?你能解释更多吗?
  • 在此示例中,由于前 2 条记录本身就是整个数据集的顶部,因此它可以正确显示 - 但是,如果让我们说不是 A、x、q 有 8 条记录,B, x, p 有 8 条记录,那么它应该显示 B,x,p 代替,这没有发生
  • @Ritu - 欢迎您!如果我的回答有帮助,请不要忘记 accept 它 - 单击答案旁边的复选标记 (v) 将其从灰色切换为已填充。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多