熊猫:每m行找到n个最小值

时间:2018-11-29 14:18:52

标签: python pandas

我有一个带有计数器的数据框,该计数器每24行增加1,并有一个值列,如下所示。

    value   counter
0   0.00    1
1   0.00    1
2   0.00    1
3   0.00    1
4   0.00    1
5   0.00    1
6   0.00    1
7   0.00    1
8   55.00   1
9   90.00   1
10  49.27   1
11  51.80   1
12  49.06   1
13  43.46   1
14  45.96   1
15  43.95   1
16  45.00   1
17  43.97   1
18  42.00   1
19  41.14   1
20  43.92   1
21  51.74   1
22  40.85   1
23  0.00    2
24  0.00    2
25  0.00    2
26  0.00    2
27  0.00    2
28  0.00    2
29  0.00    2
...     ...     ...
187     82.38   9
188     66.89   9
189     59.83   9
190     52.46   9
191     40.48   9
192     28.87   9
193     41.90   9
194     42.56   9
195     40.93   9
196     40.02   9
197     36.54   9
198     33.70   9
199     38.99   9
200     46.10   9
201     44.82   9
202     0.00    9
203     0.00    9
204     0.00    9
205     0.00    9
206     0.00    9
207     0.00    10
208     0.00    10
209     0.00    10
210     74.69   10
211     89.20   10
212     74.59   10
213     55.11   10
214     58.39   10
215     40.81   10
216     45.06   10

我想知道是否有一种方法可以创建第三个列,其中每个组的Counter值都相同,这四个值最低。请参见下面的示例,其中第一个Count = 1的组:

 value counter value 2
0   0.00    1   0.00
1   0.00    1   0.00
2   0.00    1   0.00
3   0.00    1   0.00
4   0.00    1   0.00
5   0.00    1   0.00
6   0.00    1   0.00
7   0.00    1   0.00
8   55.00   1   0.00
9   90.00   1   0.00
10  49.27   1   0.00
11  51.80   1   0.00
12  49.06   1   0.00
13  43.46   1   43.46
14  45.96   1   0.00
15  43.95   1   0.00
16  45.00   1   0.00
17  43.97   1   0.00
18  42.00   1   42.00
19  41.14   1   41.14
20  43.92   1   0.00
21  51.74   1   0.00
22  40.85   1   40.85

我了解诸如nsmallest(n,'column')之类的一些功能,但我不知道如何通过计数分组来限制它

有什么主意吗?先感谢您!

1 个答案:

答案 0 :(得分:1)

我认为您首先需要过滤出0中具有value个值的行,按sort_values进行排序,并获得DataFrame.head作为前4个值,最后添加reindex用于为不匹配的值填充0

df['value 2'] = (df[df['value'] != 0]
                   .sort_values('value')
                   .groupby('counter')['value'].head(4)
                   .reindex(df.index, fill_value=0))

print (df)
    value  counter  value 2
0    0.00        1     0.00
1    0.00        1     0.00
2    0.00        1     0.00
3    0.00        1     0.00
4    0.00        1     0.00
5    0.00        1     0.00
6    0.00        1     0.00
7    0.00        1     0.00
8   55.00        1     0.00
9   90.00        1     0.00
10  49.27        1     0.00
11  51.80        1     0.00
12  49.06        1     0.00
13  43.46        1    43.46
14  45.96        1     0.00
15  43.95        1     0.00
16  45.00        1     0.00
17  43.97        1     0.00
18  42.00        1    42.00
19  41.14        1    41.14
20  43.92        1     0.00
21  51.74        1     0.00
22  40.85        1    40.85
23   0.00        2     0.00
24   0.00        2     0.00
25   0.00        2     0.00
26   0.00        2     0.00
27   0.00        2     0.00