分组并找到属于n个唯一最大值的所有值

时间:2019-12-04 08:26:18

标签: python pandas-groupby

我的数据框:

data = {'Input':[133217,133217,133217,133217,133217,133217,132426,132426,132426,132426,132426,132426,132426,132426],
 'Font':[30,25,25,21,20,19,50,50,50,38,38,30,30,29]}

     Input  Font
0   133217    30
1   133217    25
2   133217    25
3   133217    21
4   133217    20
5   133217    19
6   132426    50
7   132426    50
8   132426    50
9   132426    38
10  132426    38
11  132426    30
12  132426    30
13  132426    29

我想创建一个仅包含字体中属于3个唯一最大值的值的新数据框。例如,输入133217的3个最大字体值为30、25、21。

预期输出:

op_data = {'Input':[133217,133217,133217,133217,132426,132426,132426,132426,132426,132426,132426],
 'Font':[30,25,25,21,50,50,50,38,38,30,30]}

     Input  Font
0   133217    30
1   133217    25
2   133217    25
3   133217    21
4   132426    50
5   132426    50
6   132426    50
7   132426    38
8   132426    38
9   132426    30
10  132426    30

我已经与pandas的groupby进行了尝试:

df = pd.DataFrame(data)
df['order'] = df.groupby('Input').cumcount()+1

然后我考虑了df['order']中的1,2,3个值,这些值没有按计划进行。还有其他方法吗?

3 个答案:

答案 0 :(得分:3)

您可以找到每个组的唯一值,获取具有三个最大值的列表,然后选择此列表中的行:

df.groupby('Input')['Font'].\
apply(lambda x: x[x.isin(np.sort(x.unique())[-3:])]).\
reset_index(level=0)

输出:

     Input  Font
6   132426    50
7   132426    50
8   132426    50
9   132426    38
10  132426    38
11  132426    30
12  132426    30
0   133217    30
1   133217    25
2   133217    25
3   133217    21

答案 1 :(得分:1)

我会分两步完成任务。

第一个正在订购数据帧。看来您的数据框已经订购。

dft = dft.sort_values(by=['Input','Font'],ascending=False)

然后,使用“输入”列和head(3)进行分组,以获取每个不同的“输入”组的前3名:

dft = dft.groupby('Input').head(3)
print(dft)

    Input  Font
0  133217    30
1  133217    25
2  133217    25
6  132426    50
7  132426    50
8  132426    50

答案 2 :(得分:0)

或者,您可以使用pandas.DataFrame.nlargest()函数:

df.drop_duplicates().groupby('Input').apply(lambda grp: grp.nlargest(3, 'Font'))

# 132426 6   132426    50
#        9   132426    38
#        11  132426    30
# 133217 0   133217    30
#        1   133217    25
#        3   133217    21

请不要删除任何重复值,因此不予考虑。