按熊猫排序后按组排名

时间:2020-10-21 18:46:46

标签: python pandas pandas-groupby

我有一个看起来像这样的数据框

pd.DataFrame({'A': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'],
   ...:                    'B': ['C1', 'C1', 'C1', 'C1', 'C2', 'C2', 'C2', 'C2'],
   ...:                    'X': [1, 2, 1, 2, 2, 3, 4, 5],
   ...:                    'Y': [2, 1, 2, 2, 7, 5, 7, 7],
   ...:                    'Z': [2, 1, 2, 1, 5, 8, 1, 9]})
Out[10]: 
   A   B  X  Y  Z
0  A  C1  1  2  2
1  B  C1  2  1  1
2  C  C1  1  2  2
3  D  C1  2  2  1
4  E  C2  2  7  5
5  F  C2  3  5  8
6  G  C2  4  7  1
7  H  C2  5  7  9

我需要按B,X,Y,Z列对数据框进行排序,然后在每组B中进行排名。

结果数据框应如下所示。

Out[12]: 
   A   B  X  Y  Z   R
1  B  C1  2  1  1   1
3  D  C1  2  2  1   2
0  A  C1  1  2  2   3
2  C  C1  1  2  2   4
6  G  C2  4  7  1   1
5  F  C2  3  5  2   2
4  E  C2  2  1  5   3
7  H  C2  5  7  9   4

我知道我可以使用df.sort_values(['B','Z','Y','X'])使顺序正确,但努力应用排名。

用于排序和排名的1行代码是什么?

1 个答案:

答案 0 :(得分:2)

您可以使用groupby().cumcount()

df['R'] = df.sort_values(['B','X','Y','Z']).groupby('B').cumcount() + 1

输出:

   A   B  X  Y  Z  R
0  A  C1  1  2  2  3
1  B  C1  2  1  1  1
2  C  C1  1  2  2  4
3  D  C1  2  2  1  2
4  E  C2  2  7  5  2
5  F  C2  3  5  8  3
6  G  C2  4  7  1  1
7  H  C2  5  7  9  4

要匹配您的输出,请分别将sort_valuesgroupby()

df = df.sort_values(['B','Z','Y','X'])
df['R'] = df.groupby('B').cumcount() + 1

输出:

   A   B  X  Y  Z  R
1  B  C1  2  1  1  1
3  D  C1  2  2  1  2
0  A  C1  1  2  2  3
2  C  C1  1  2  2  4
6  G  C2  4  7  1  1
4  E  C2  2  7  5  2
5  F  C2  3  5  8  3
7  H  C2  5  7  9  4