【问题标题】:how to sort within each group of a dataframe while retaining other column如何在保留其他列的同时对数据框的每组进行排序
【发布时间】:2023-01-26 21:30:11
【问题描述】:

我正在处理一个包含数百万行的大型数据框。

样本数据:

import pandas as pd
df = pd.DataFrame({'id' : ['c1','c2','c1','c3','c2','c1','c3'],
                  'it' : ['it1','it2','it1','it5','it3','it7','it'],
                  'score' : [.8,.5,1.1,.65,.89,1.2,.91]})

df
    id  it  score
0   c1  it1 0.8
1   c2  it2 0.5
2   c1  it1 1.1
3   c3  it5 0.65
4   c2  it3 0.89
5   c1  it7 1.2
6   c3  it  0.91

我正在使用以下方法对每个组内的数据框进行排序:

df.groupby('id', as_index = False).\
    apply(pd.DataFrame.sort_values, 'score', ascending=False)

        id  it  score
0   5   c1  it7 1.2
0   2   c1  it1 1.1
0   0   c1  it1 0.8
1   4   c2  it3 0.89
1   1   c2  it2 0.5
2   6   c3  it  0.91
2   3   c3  it5 0.65

但是由于数据量很大,apply 的过程花费了大量时间。 有人可以让我知道如何以更省时的方式执行相同的操作吗?

【问题讨论】:

  • 首先按score 对整个数据框进行排序,然后按id 排序,我认为应该可以

标签: python pandas


【解决方案1】:

您可以使用布尔列表按升序/降序对idscore 进行排序:

df.sort_values(['id','score'], ascending=[True, False])

【讨论】:

    【解决方案2】:

    全部 :

    df1 = (df.assign(tmp=df['id'].ne(df['id'].shift()).cumsum())
             .sort_values(['tmp','score'], ascending=[True, False])
             .drop('tmp', axis=1))
    
    
    df1 = (df.set_index(df['id'].ne(df['id'].shift()).cumsum().rename('i'))
             .sort_values(['i','score'], ignore_index=True, ascending=[True, False]))
    

    如果可能的话:

    df2 = df.sort_values(['id','score'], ascending=[True, False])
    

    【讨论】:

      猜你喜欢
      • 2020-03-08
      • 2021-01-29
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-28
      • 2021-10-15
      • 1970-01-01
      相关资源
      最近更新 更多