Pandas---实现SQL中分组排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wendaomudong_l2d4/article/details/84818133

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 于南京市栖霞区紫东创业园

猜你喜欢

转载自blog.csdn.net/wendaomudong_l2d4/article/details/84818133