根据分类列的值数对熊猫数据框进行排序

时间:2021-02-04 07:30:21

标签: python pandas dataframe

示例数据集如下所示

<头>
col1 col2 col3
A 1 as
A 2 sd
B 3 df
C 5 fg
D 6 gh
A 1 hj
B 3 jk
B 4 kt
A 1 重新
C 5 我们
D 6 qw
D 7 aa

我想根据每个项目出现的次数对列 col1 进行排序,例如A 有 4 次出现,B 和 D 有 3 次,C 有 2 次出现。数据框应按 A、A、A、A、B、B、B、D、D、D、C、C 进行排序,以便

有没有办法实现相同的目标?我可以使用 sort_values 来获得想要的结果吗?

2 个答案:

答案 0 :(得分:4)

通过 Series.mapSeries.value_counts 创建辅助列,并将其用于通过 DataFrame.sort_valuescol1 进行排序:

df['new'] = df['col1'].map(df['col1'].value_counts())
#alternative
#df['new'] = df.groupby('col1')['col1'].transform('count')

df1 = df.sort_values(['new','col1'], ascending=[False, True]).drop('new', axis=1)

单行解决方案:

df1 = (df.assign(new =df['col1'].map(df['col1'].value_counts()))
         .sort_values(['new','col1'], ascending=[False, True])
         .drop('new', axis=1))

print (df1)
   col1  col2 col3
0     A     1   as
1     A     2   sd
5     A     1   hj
8     A     1   re
2     B     3   df
6     B     3   jk
7     B     4   kt
4     D     6   gh
10    D     6   qw
11    D     7   aa
3     C     5   fg
9     C     5   we

答案 1 :(得分:1)

您可以使用 sort_values,但您必须提供一个可调用的 key。来自文档:

<块引用>

在排序前对值应用键函数。这是相似的 到内置 sorted() 函数中的关键参数,值得注意的是 不同之处在于这个关键函数应该被向量化。这应该 期望一个系列并返回一个与输入形状相同的系列。 它将被独立地应用于每一列。

在您的情况下,键函数必须计算每个值出现在 col1 中的次数。

df.sort_values(by='col1', key=lambda x: [((df.col1 == y).sum(), -ord(y)) for y in x], ascending=False)

元组 ((df.col1 == y).sum(), -ord(y)) 用于对出现次数相同的字母进行排序,使用表示其 Unicode 字符的整数。

如果您的数据框很大,您应该使用 values_countsmap 预先计算这些值:

df.sort_values(by='col1', key=lambda x: df.col1.map({k: (v, -ord(k)) for k,v in df.col1.value_counts().to_dict().items()}), ascending=False)

结果如下:

   col1  col2 col3
0     A     1   as
1     A     2   sd
5     A     1   hj
8     A     1   re
2     B     3   df
6     B     3   jk
7     B     4   kt
4     D     6   gh
10    D     6   qw
11    D     7   aa
3     C     5   fg
9     C     5   we