Python 中 Pandas dataframe 按组大小降序排序
在 Pandas 中,可以使用 groupby() 方法将数据按照某些列分组,然后对每个分组进行操作。但是分组之后,如何根据每组大小(即行数)来排序呢?
假设我们有以下 Pandas dataframe:
import pandas as pd
df = pd.DataFrame({
'Group': [1, 1, 2, 2, 2],
'Value': [10, 20, 30, 40, 50]
})
print(df)
输出:
Group Value
0 1 10
1 1 20
2 2 30
3 2 40
4 2 50
现在我们想要把数据按照 Group 分组,并按照每组的大小降序排序。我们可以使用以下代码:
df.groupby('Group').apply(lambda x: x.sort_values('Value', ascending=False)).reset_index(drop=True)
解释一下这行代码:
- groupby(‘Group’):按照 Group 列进行分组;
- apply(…):对每个分组应用一次函数。这里我们使用了一个 lambda 表达式,将每个分组按照 Value 的值进行降序排序;
- reset_index(drop=True):重新设置索引,丢弃之前的分组索引。
输出:
Group Value
0 1 20
1 1 10
2 2 50
3 2 40
4 2 30
可以看到,数据按照 Group 分组后,每个分组内部按照 Value 的值进行了降序排序。
如果想要保留原始数据的顺序,可以调用 sort_values() 方法,先按照 Group 进行排序,再按照 Value 进行排序:
df.sort_values(['Group', 'Value'], ascending=[True, False])
输出:
Group Value
1 1 20
0 1 10
4 2 50
3 2 40
2 2 30
结论
使用 Pandas 中的 groupby() 方法,可以方便地将数据按照某些列进行分组。如果想要按照每个分组的大小降序排序,可以使用 apply() 方法和 lambda 表达式来实现。如果想要保留原始数据的顺序,可以使用 sort_values() 方法先按照一个列进行排序,再按照另一个列进行排序。
极客笔记