我的数据框如下
Itr Type Start Values
2 1 101 20.402
2 1 102 20.402
2 1 103 20.399
2 1 104 20.399
2 1 105 20.399
2 1 106 20.383
2 1 107 20.383
2 1 108 20.383
2 1 109 20.383
2 1 110 20.383
2 1 111 20.36
2 1 112 20.36
2 1 113 20.36
2 1 114 20.36
2 1 115 20.36
2 1 116 20.36
2 1 117 20.36
2 1 118 20.36
2 1 119 20.36
2 1 120 20.36
3 1 121 20.348
3 1 122 20.348
3 1 123 20.348
3 1 124 20.348
3 1 125 20.348
3 1 126 20.34
3 1 127 20.34
3 1 128 20.34
3 1 129 20.34
3 1 130 20.34
3 1 131 20.337
3 1 132 20.337
3 1 133 20.337
3 1 134 20.337
3 1 135 20.337
3 1 136 20.342
3 2 121 20.058
3 2 122 20.058
3 2 123 20.058
3 2 124 20.058
3 2 125 20.043
3 2 126 20.043
3 2 127 20.043
3 2 128 20.043
3 2 129 20.043
3 2 130 20.035
3 2 131 20.035
3 2 132 20.035
3 2 133 20.035
3 2 134 20.035
3 2 135 20.021
我想对迭代(Itr)进行分组,然后键入&然后找到最大值的出现次数和第二个最大值的出现次数。 例如,对于Irr 2和周期1的分组,结果应该为2和3,因为20.402(最大值)出现两次,而20.399(第二最大值)出现三次。我已经尝试过但没有成功。有办法吗?谢谢
答案 0 :(得分:1)
首先获得每个组中最高值的掩码。然后获取被屏蔽的DataFrame的大小。
m = df.groupby(['Itr', 'Type'])['Values'].transform(lambda x: x.isin(x.drop_duplicates().nlargest(2)))
df.where(m).groupby(['Itr', 'Type', 'Values']).size()
Itr Type Values
2.0 1.0 20.399 3
20.402 2
3.0 1.0 20.342 1
20.348 5
2.0 20.043 5
20.058 4
dtype: int64
或者使用groupby
+ value_counts
,然后使用sort
和groupby
+ tail
将两个最大值保持在组中。
(df.groupby(['Itr', 'Type'])['Values'].value_counts()
.sort_index(level=2)
.groupby(level=[0, 1]).tail(2))
Itr Type Values
3 2 20.043 5
20.058 4
1 20.342 1
20.348 5
2 1 20.399 3
20.402 2
Name: Values, dtype: int64