我的数据框:
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个值,这些值没有按计划进行。还有其他方法吗?
答案 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
请不要删除任何重复值,因此不予考虑。