示例数据集如下所示
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 来获得想要的结果吗?
答案 0 :(得分:4)
通过 Series.map
和 Series.value_counts
创建辅助列,并将其用于通过 DataFrame.sort_values
对 col1
进行排序:
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_counts
和 map
预先计算这些值:
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