Pandas 熊猫根据绝对值从每组中选择前2名

Pandas 熊猫根据绝对值从每组中选择前2名,pandas,python-3.8,Pandas,Python 3.8,我有一个数据帧df: 我想得到以下信息: Col1 Col2 Val1 A a -101 A a 40 A b 22 B b -55 B b -27 其中,对于Col1和Col2中的每组,我根据Val1的绝对值选择前2名。我不知道如何处理这个问题。我们可以做: df.loc[df['Val1'].abs().groupby([df['Col1'], df['Col2']

我有一个数据帧df:

我想得到以下信息:

Col1    Col2    Val1
A       a      -101
A       a       40
A       b       22
B       b      -55
B       b      -27
其中,对于Col1和Col2中的每组,我根据Val1的绝对值选择前2名。我不知道如何处理这个问题。

我们可以做:

df.loc[df['Val1'].abs().groupby([df['Col1'], df['Col2']])
                       .rank(ascending=False).le(2)]


  Col1 Col2  Val1
1    A    a  -101
2    A    a    40
3    A    b    22
5    B    b   -55
7    B    b   -27
我们可以做到:

df.loc[df['Val1'].abs().groupby([df['Col1'], df['Col2']])
                       .rank(ascending=False).le(2)]


  Col1 Col2  Val1
1    A    a  -101
2    A    a    40
3    A    b    22
5    B    b   -55
7    B    b   -27

使用argsort的另一个选项

 df.loc[df['Val1'].abs().argsort()[::-1]].groupby(['Col1','Col2']).head(2).sort_values(by = 'Col1')

使用argsort的另一个选项

 df.loc[df['Val1'].abs().argsort()[::-1]].groupby(['Col1','Col2']).head(2).sort_values(by = 'Col1')

您缺少A,b对,该对提供22另一个选项是创建pusedo密钥,但这个答案更好-df.assignkey=df[Val1].abs.sort\u valueskey,ascending=False.dropkey,1.groupby[Col1,Col2].head2.sort\u valuescol1您缺少A对,b对,该对提供22另一个选项是创建pusedo密钥,但是这个答案更好-df.assignkey=df[Val1].abs.sort_valueskey,升序=False.dropkey,1.groupby[Col1,Col2].head2.sort_valuesCol1