pyspark,pandas,sql之分组排序

28 篇文章 0 订阅
# coding=utf-8

import pandas as pd
from pyspark.sql import SparkSession, Window
from pyspark.sql import functions as fn


pdf = pd.DataFrame({
    'project': ['A', 'A', 'A', 'B', 'B', 'B'],
    'grade': ['D', 'D', 'C', 'C', 'E', 'E'],
    'score': ['K','J', 'I','H', 'G', 'F'],
})
print(pdf)

## pyspark:
spark = SparkSession.builder.master('local').appName('rank_app').getOrCreate()
df = spark.createDataFrame(pdf)
df = df.withColumn('row_num', fn.row_number().over(Window.partitionBy('project')\
                                                   .orderBy(fn.desc('grade'), fn.asc('score'))))
df.orderBy(fn.asc('project'), fn.desc('score')).show()
spark.stop()


## sql:
'''
SELECT project, grade, score
    , ROW_NUMBER() OVER (PARTITION BY project ORDER BY grade DESC, score ASC) AS row_num
FROM table
ORDER BY project, score DESC
'''

## pandas 1:
# for col in list(pdf.columns):
#     hash_table = {v:i+1 for i,v in enumerate(sorted(pdf[col].unique()))}
#     pdf[f'nk_{col}'] = pdf[col].apply(lambda x: hash_table.get(x))
#
# # desc:
# pdf['neg_nk_grade'] = pdf['nk_grade'] * (-1)
# # rank:
# pdf['row_num'] = pdf[['project','neg_nk_grade','nk_score']].groupby(['project']).rank(ascending=True,method='first',na_option='bottom')
# pdf = pdf[['project','grade','score','rank_num']]
# print(pdf)

## error ~~~
## 只适合分组之后的一列排序,不能进行多列排序,更不能多列正逆序
## 非数字列不能进行排序
## 非数字列在numeric_only=False下,不能使用method='first',shit!

## pandas 2:
pdf['row_num'] = pdf.sort_values(['grade','score'], ascending=[False,True]).groupby(['project']).cumcount()+1
print(pdf)
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值