首页 > 解决方案 > Pandas:找到每 m 行的 n 个最小值

问题描述

我有一个带有计数器的数据框,每 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 具有相同值的每个组中创建具有 4 个最低值的第三列。请参见下面的第一个 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')但我不知道如何使用 Count 分组来限制它

任何想法?先感谢您!.

标签: pythonpandas

解决方案


I think you need first filter out rows with 0 values in value, sorting by sort_values and get DataFrame.head for top 4 values, last add reindex for filling 0 for not matched values:

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

推荐阅读