按列1的行数和类别对数据帧排序

2024-09-26 18:11:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我想按给定的列字段和该字段的条目数对这个数据帧进行排序。你知道吗

假设我有一个非常简单的数据帧,看起来像这样:

      name  age
0     Paul   12
1     Ryan   17
2  Michael  100
3     Paul   36
4     Paul   66
5  Michael   45

我想要的结果是

      name  age
0     Paul   12
1     Paul   36
2     Paul   66
3  Michael  100
4  Michael   45
5     Ryan   17

所以我有3个保罗的,所以他们先上来,然后是2个迈克尔的,最后只有1个瑞恩。你知道吗


Tags: 数据nameage排序条目michaelpaulryan
3条回答

一个选项:使用value_counts获取最常用的名称,然后设置、排序和重置索引:

x = list(df['name'].value_counts().index)
df.set_index('name').loc[x].reset_index()

退货

      name  age
0     Paul   12
1     Paul   36
2     Paul   66
3  Michael  100
4  Michael   45
5     Ryan   17

我添加的唯一变化是能够按姓名计数和年龄排序。你知道吗

    df['name_count'] = df['name'].map(df['name'].value_counts())
    df = df.sort_values(by=['name_count', 'age'], 
                        ascending=[False,True]).drop('name_count', axis=1)
    df.reset_index(drop=True)


        name    age
      0 Paul    12
      1 Paul    36
      2 Paul    66
      3 Michael 45
      4 Michael 100
      5 Ryan    17

需要创建一个helper列来排序,在本例中是名称组的size。如果您喜欢全新的RangeIndex,请添加.reset_index(drop=True),如果原始索引有用,请保持原样。你知道吗

排序不会改变相等值内的顺序,因此第一行总是出现在'Paul'内的第一行

(df.assign(s = df.groupby('name').name.transform('size'))
   .sort_values('s', ascending=False)
   .drop(columns='s'))

输出

      name  age
0     Paul   12
3     Paul   36
4     Paul   66
2  Michael  100
5  Michael   45
1     Ryan   17

为了消除评论中引起的恐惧,这种方法非常有效。比上述方法更重要。而且你不会破坏你的初始索引。你知道吗

import numpy as np
np.random.seed(42)
N = 10**6
df = pd.DataFrame({'name': np.random.randint(1, 10000, N),
                   'age': np.random.normal(0, 1, N)})

%%timeit 
(df.assign(s = df.groupby('name').name.transform('size'))
   .sort_values('s', ascending=False)
   .drop(columns='s'))
#500 ms ± 31.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%%timeit 
x = list(df['name'].value_counts().index)
df.set_index('name').loc[x].reset_index()
#2.67 s ± 166 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

相关问题 更多 >

    热门问题