groupby之后在熊猫中最高和第二最高值的出现次数

时间:2019-06-18 03:46:39

标签: pandas pandas-groupby

我的数据框如下

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(第二最大值)出现三次。我已经尝试过但没有成功。有办法吗?谢谢

1 个答案:

答案 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,然后使用sortgroupby + 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