1. 程式人生 > >Pandas---實現SQL中分組排序

Pandas---實現SQL中分組排序

hive中經常會用到row_number這個函式,比如取使用者第n次購買,前n次購買記錄等等。那麼python中如何實現呢?直接看個例子即可

下面是a、b兩個使用者購買的記錄,user為使用者名稱,amount為消費金額,要去按照user分組,組內按照amount降序排序,並且新增一列標識序號

import pandas as pd
df = pd.DataFrame({'user':['a','a','a','b','b'],'amount':[21,11,31,32,42]})
df
user amount
0 a 21
1 a 11
2 a 31
3 b 32
4 b 42

下面構建輔助函式:
這個函式兩個功能,一個是提供分組排序的功能
另外提供部分聚合函式的功能

import pandas as pd
def test_f(df,column,istopn = False,n=1):
    """
    df:資料框
    column:為需要對之聚合的列
    istopn:返回每一組的第n行資料
    """
count = len(df) distinct_count = df[column].nunique() sum = df[column].sum() avg = df[column].mean() if istopn == True: # 降序生序,自己注意 # df.sort_values(by=column, ascending=False)[:n] # 返回前n個 temp_data = df.sort_values(by=column, ascending=False) temp_data[
'row'] = range(len(df)) return temp_data else: return pd.DataFrame({'count':[count],'distinct_count':[distinct_count],'sum':[sum],'avg':[avg]})
df_sort = df.groupby(['user']).apply(test_f,column = 'amount',istopn = True)
df_sort
user amount row
user
a 2 a 31 0
0 a 21 1
1 a 11 2
b 4 b 42 0
3 b 32 1

改變行索引

df_sort.index = range(len(df_sort))
df_sort
user amount row
0 a 31 0
1 a 21 1
2 a 11 2
3 b 42 0
4 b 32 1

後面對row這一列進行篩選,即可.

                                                 2018-12-105 於南京市棲霞區紫東創業園