版权声明:本文为博主原创文章,未经博主允许不得转载。 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 于南京市栖霞区紫东创业园