找回密码
 会员注册
查看: 14|回复: 0

python常用pandas函数nlargestnsmallest及其手动实现

[复制链接]

2万

主题

0

回帖

7万

积分

超级版主

积分
72170
发表于 2024-9-7 19:28:24 | 显示全部楼层 |阅读模式
目录pandas库Series和DataFramenlargest和nsmallest用法示例代替方法手动实现模拟代码加强升级pandas库是Python中一个非常强大的数据处理库,提供了高效的数据分析方法和数据结构。它特别适用于处理具有关系型数据或带标签数据的情况,同时在时间序列分析方面也有着出色的表现。pandas库广泛应用于数据挖掘和分析、金融和经济分析、科学和工程计算等领域。使用pandas库可以轻松地对数据进行筛选、排序、过滤、清理和变换等操作,并可以进行统计和汇总等分析,从而提高数据处理的效率和精度。pandas库还提供了许多常用的函数和方法,例如数据筛选和排序、数据合并和连接等。Series和DataFramepandas库中最常用的数据类型是Series和DataFrame。Series是一维数组,拥有数据与索引;而DataFrame则是一个类似于表格的二维数据结构,其中储存了多个Series。例如:>>>importpandasaspd>>>df=pd.DataFrame({'Title':['流浪地球2','奥本海默','俄罗斯方块','银河护卫队3','我爱你!','电锯惊魂10','灌篮高手','梦的背后','漫长的季节','1923第一季','黑暗荣耀第二季','重启人生','画江湖之不良人6','地球脉动第三季'],'Award':['评分最高华语电影','评分最高外语电影','年度冷门佳片','评分最高喜剧片','评分最高爱情片','评分最高恐怖片','评分最高动画片','评分最高纪录片','评分最高华语剧集','评分最高英美新剧','评分最高韩国剧集','评分最高日本剧集','评分最高动画剧集','评分最高纪录剧集'],'Score':[9.5,8.8,8.0,8.4,7.9,7.4,8.9,9.0,9.4,9.3,9.0,9.3,9.4,9.8]})>>>df    Title  Award Score0   流浪地球2 评分最高华语电影  9.51    奥本海默 评分最高外语电影  8.82   俄罗斯方块  年度冷门佳片  8.03  银河护卫队3 评分最高喜剧片  8.44    我爱你! 评分最高爱情片  7.95  电锯惊魂10 评分最高恐怖片  7.46    灌篮高手 评分最高动画片  8.97    梦的背后 评分最高纪录片  9.08   漫长的季节 评分最高华语剧集  9.49  1923第一季 评分最高英美新剧  9.310 黑暗荣耀第二季 评分最高韩国剧集  9.011   重启人生 评分最高日本剧集  9.312 画江湖之不良人6 评分最高动画剧集  9.413 地球脉动第三季 评分最高纪录剧集  9.8nlargest和nsmallest本篇就简单说说pandas数据筛选和排序中的nlargest/nsmallest两个函数的用法:DataFrame.nlargest(n,columns,keep='first')Series.nlargest(n,keep='first')DataFrame.nsmallest(n,columns,keep='first')Series.nsmallest(n,keep='first')n是一个整数,表示要返回的行数或值数。columns是一个标签或标签列表,表示要按照哪些列进行排序。只适用于DataFrame,不适用于Series。keep是一个字符串,表示当有相同值的时候,如何处理。可以取以下三个值之一:  'first':保留第一个出现的行或值。  'last':保留最后一个出现的行或值。   'all':保留所有出现的行或值。nlargest函数会返回一个新的DataFrame或Series,包含原数据中最大的n个值,按照降序排列。如果指定了多个列,那么会按照列的顺序依次进行排序。如果原数据中的值不是数值类型,那么会抛出TypeError异常。nsmallest函数则按照升序排列,另外如使用参数keep='all',会导致返回的结果数会超过第一个参数n的值。用法示例>>>df.nlargest(3,'Score',keep='first')    Title  Award Score13 地球脉动第三季 评分最高纪录剧集  9.80  流浪地球2 评分最高华语电影  9.58   漫长的季节 评分最高华语剧集  9.4>>>df.nlargest(3,'Score',keep='last')    Title  Award Score13 地球脉动第三季 评分最高纪录剧集  9.80   流浪地球2 评分最高华语电影  9.512 画江湖之不良人6 评分最高动画剧集  9.4>>>df.nlargest(3,'Score')    Title  Award Score13 地球脉动第三季 评分最高纪录剧集  9.80  流浪地球2 评分最高华语电影  9.58   漫长的季节 评分最高华语剧集  9.4>>>df.nlargest(3,'Score',keep='all')    Title  Award Score13 地球脉动第三季 评分最高纪录剧集  9.80   流浪地球2 评分最高华语电影  9.58   漫长的季节 评分最高华语剧集  9.412 画江湖之不良人6 评分最高动画剧集  9.4>>>df.nsmallest(3,'Score')   Title  Award Score5 电锯惊魂10 评分最高恐怖片  7.44  我爱你! 评分最高爱情片  7.92  俄罗斯方块 年度冷门佳片  8.0代替方法df.sort_values()加切片也能实现nlargest和nsmallest的基本功能:>>>df.sort_values('Score')[-3:][::-1]    Title  Award Score13 地球脉动第三季 评分最高纪录剧集  9.80   流浪地球2 评分最高华语电影  9.512 画江湖之不良人6 评分最高动画剧集  9.4>>>df.sort_values('Score')[:3]   Title  Award Score5 电锯惊魂10 评分最高恐怖片  7.44  我爱你! 评分最高爱情片  7.92  俄罗斯方块 年度冷门佳片  8.0手动实现假如我们不使用pandas,只用python基础数据类型dict()来实现这些功能:>>>dic={'Title':['流浪地球2','奥本海默','俄罗斯方块','银河护卫队3','我爱你!','电锯惊魂10','灌篮高手','梦的背后','漫长的季节','1923第一季','黑暗荣耀第二季','重启人生','画江湖之不良人6','地球脉动第三季'],'Award':['评分最高华语电影','评分最高外语电影','年度冷门佳片','评分最高喜剧片','评分最高爱情片','评分最高恐怖片','评分最高动画片','评分最高纪录片','评分最高华语剧集','评分最高英美新剧','评分最高韩国剧集','评分最高日本剧集','评分最高动画剧集','评分最高纪录剧集'],'Score':[9.5,8.8,8.0,8.4,7.9,7.4,8.9,9.0,9.4,9.3,9.0,9.3,9.4,9.8]}>>>dic['Title']['流浪地球2','奥本海默','俄罗斯方块','银河护卫队3','我爱你!','电锯惊魂10','灌篮高手','梦的背后','漫长的季节','1923第一季','黑暗荣耀第二季','重启人生','画江湖之不良人6','地球脉动第三季']>>>dic['Score'][9.5,8.8,8.0,8.4,7.9,7.4,8.9,9.0,9.4,9.3,9.0,9.3,9.4,9.8]使用内置函数sorted,zip一行代码就能实现:>>>sorted(zip(dic['Title'],dic['Award'],dic['Score']),key=lambdax:x[-1])[-3:][::-1][('地球脉动第三季','评分最高纪录剧集',9.8),('流浪地球2','评分最高华语电影',9.5),('画江湖之不良人6','评分最高动画剧集',9.4)]>>>sorted(zip(dic['Title'],dic['Award'],dic['Score']),key=lambdax:x[-1])[:3][('电锯惊魂10','评分最高恐怖片',7.4),('我爱你!','评分最高爱情片',7.9),('俄罗斯方块','年度冷门佳片',8.0)]如果也想实现参数keep=last和all,那就稍微复杂些,你可以试试如何实现?模拟代码classDataFrame:def__init__(self,dic):self.dic=dicdefnlargest(self,n,Column,keep='first'):ifnlen(self):n=len(self)ifcolumnnotinself.__dic:raiseKeyError(f'{column}')function=__import__('sys')._getframe(1).f_code.co_namecolumn_type=f"Column'{column}'hasdtypeobject,cannotusemethod'{function}'withthisdtype"ifnotall([isinstance(_,int)orisinstance(_,float)for_inself.__dic[column]]):raiseTypeError(column_type)idx=list(self.__dic.keys()).index(column)tmp=sorted(zip(*self.__lst),key=lambdax:x[idx],reverse=reverse)lst=tmp[:n]num=lst[-1][idx]matchkeep:case'first':passcase'last':fortintmp[n:]:ifnum==t[idx]:lst[-1]=telse:breakcase'all':fortintmp[n:]:ifnum==t[idx]:lst.append(t)else:breakcase_:raiseValueError('keepmustbeeither"first","last"or"all"')res=dict()forrowinlst:forcol,keyinenumerate(self.__dic.keys()):tmp=res.get(key,[])tmp.append(row[col])res[key]=tmpreturnDataFrame(res)defnlargest(self,n,column,keep='first'):returnself.__sort__(n,column,keep)defnsmallest(self,n,column,keep='first'):returnself.__sort__(n,column,keep,reverse=False)dic={'Title':['流浪地球2','奥本海默','俄罗斯方块','银河护卫队3','我爱你!','电锯惊魂10','灌篮高手','梦的背后','漫长的季节','1923第一季','黑暗荣耀第二季','重启人生','画江湖之不良人6','地球脉动第三季'],'Award':['评分最高华语电影','评分最高外语电影','年度冷门佳片','评分最高喜剧片','评分最高爱情片','评分最高恐怖片','评分最高动画片','评分最高纪录片','评分最高华语剧集','评分最高英美新剧','评分最高韩国剧集','评分最高日本剧集','评分最高动画剧集','评分最高纪录剧集'],'Score':[9.5,8.8,8.2,8.2,8.2,7.8,9.0,9.0,9.4,9.3,9.0,9.3,9.4,9.8],}df=DataFrame(dic)print('DataFrame:')print(df)kp='first','last','all'formin(3,7):print(f"df.nlargest({m},'Score'):")forkinkp:print(f'keep={k}:')print(df.nlargest(m,'Score',keep=k))print("df.nsmallest(2,'Score')")forkinkp:print(f'keep={k}:')print(df.nsmallest(2,'Score',keep=k))#改变字典的键值顺序dic={'Score':[9.5,8.8,8.2,8.2,8.2,7.8,9.0,9.0,9.4,9.3,9.0,9.3,9.4,9.8],'Title':['流浪地球2','奥本海默','俄罗斯方块','银河护卫队3','我爱你!','电锯惊魂10','灌篮高手','梦的背后','漫长的季节','1923第一季','黑暗荣耀第二季','重启人生','画江湖之不良人6','地球脉动第三季'],'Award':['评分最高华语电影','评分最高外语电影','年度冷门佳片','评分最高喜剧片','评分最高爱情片','评分最高恐怖片','评分最高动画片','评分最高纪录片','评分最高华语剧集','评分最高英美新剧','评分最高韩国剧集','评分最高日本剧集','评分最高动画剧集','评分最高纪录剧集'],}df=DataFrame(dic)print(df)formin(3,7):print(f"df.nlargest({m},'Score'):")forkinkp:print(f'keep={k}:')print(df.nlargest(m,'Score',keep=k))print("df.nsmallest(2,'Score')")forkinkp:print(f'keep={k}:')print(df.nsmallest(2,'Score',keep=k))'运行运行注:如果Python版本低于3.10 ,上述代码中match-case需要改回if-elif-else结构。运行结果:DataFrame:'流浪地球2','评分最高华语电影',9.5'奥本海默','评分最高外语电影',8.8'俄罗斯方块','年度冷门佳片',8.2'银河护卫队3','评分最高喜剧片',8.2'我爱你!','评分最高爱情片',8.2'电锯惊魂10','评分最高恐怖片',7.8'灌篮高手','评分最高动画片',9.0'梦的背后','评分最高纪录片',9.0'漫长的季节','评分最高华语剧集',9.4'1923第一季','评分最高英美新剧',9.3'黑暗荣耀第二季','评分最高韩国剧集',9.0'重启人生','评分最高日本剧集',9.3'画江湖之不良人6','评分最高动画剧集',9.4'地球脉动第三季','评分最高纪录剧集',9.8df.nlargest(3,'Score'):keep=first:'地球脉动第三季','评分最高纪录剧集',9.8'流浪地球2','评分最高华语电影',9.5'漫长的季节','评分最高华语剧集',9.4keep=last:'地球脉动第三季','评分最高纪录剧集',9.8'流浪地球2','评分最高华语电影',9.5'画江湖之不良人6','评分最高动画剧集',9.4keep=all:'地球脉动第三季','评分最高纪录剧集',9.8'流浪地球2','评分最高华语电影',9.5'漫长的季节','评分最高华语剧集',9.4'画江湖之不良人6','评分最高动画剧集',9.4df.nlargest(7,'Score'):keep=first:'地球脉动第三季','评分最高纪录剧集',9.8'流浪地球2','评分最高华语电影',9.5'漫长的季节','评分最高华语剧集',9.4'画江湖之不良人6','评分最高动画剧集',9.4'1923第一季','评分最高英美新剧',9.3'重启人生','评分最高日本剧集',9.3'灌篮高手','评分最高动画片',9.0keep=last:'地球脉动第三季','评分最高纪录剧集',9.8'流浪地球2','评分最高华语电影',9.5'漫长的季节','评分最高华语剧集',9.4'画江湖之不良人6','评分最高动画剧集',9.4'1923第一季','评分最高英美新剧',9.3'重启人生','评分最高日本剧集',9.3'黑暗荣耀第二季','评分最高韩国剧集',9.0keep=all:'地球脉动第三季','评分最高纪录剧集',9.8'流浪地球2','评分最高华语电影',9.5'漫长的季节','评分最高华语剧集',9.4'画江湖之不良人6','评分最高动画剧集',9.4'1923第一季','评分最高英美新剧',9.3'重启人生','评分最高日本剧集',9.3'灌篮高手','评分最高动画片',9.0'梦的背后','评分最高纪录片',9.0'黑暗荣耀第二季','评分最高韩国剧集',9.0df.nsmallest(2,'Score')keep=first:'电锯惊魂10','评分最高恐怖片',7.8'俄罗斯方块','年度冷门佳片',8.2keep=last:'电锯惊魂10','评分最高恐怖片',7.8'我爱你!','评分最高爱情片',8.2keep=all:'电锯惊魂10','评分最高恐怖片',7.8'俄罗斯方块','年度冷门佳片',8.2'银河护卫队3','评分最高喜剧片',8.2'我爱你!','评分最高爱情片',8.29.5,'流浪地球2','评分最高华语电影'8.8,'奥本海默','评分最高外语电影'8.2,'俄罗斯方块','年度冷门佳片'8.2,'银河护卫队3','评分最高喜剧片'8.2,'我爱你!','评分最高爱情片'7.8,'电锯惊魂10','评分最高恐怖片'9.0,'灌篮高手','评分最高动画片'9.0,'梦的背后','评分最高纪录片'9.4,'漫长的季节','评分最高华语剧集'9.3,'1923第一季','评分最高英美新剧'9.0,'黑暗荣耀第二季','评分最高韩国剧集'9.3,'重启人生','评分最高日本剧集'9.4,'画江湖之不良人6','评分最高动画剧集'9.8,'地球脉动第三季','评分最高纪录剧集'df.nlargest(3,'Score'):keep=first:9.8,'地球脉动第三季','评分最高纪录剧集'9.5,'流浪地球2','评分最高华语电影'9.4,'漫长的季节','评分最高华语剧集'keep=last:9.8,'地球脉动第三季','评分最高纪录剧集'9.5,'流浪地球2','评分最高华语电影'9.4,'画江湖之不良人6','评分最高动画剧集'keep=all:9.8,'地球脉动第三季','评分最高纪录剧集'9.5,'流浪地球2','评分最高华语电影'9.4,'漫长的季节','评分最高华语剧集'9.4,'画江湖之不良人6','评分最高动画剧集'df.nlargest(7,'Score'):keep=first:9.8,'地球脉动第三季','评分最高纪录剧集'9.5,'流浪地球2','评分最高华语电影'9.4,'漫长的季节','评分最高华语剧集'9.4,'画江湖之不良人6','评分最高动画剧集'9.3,'1923第一季','评分最高英美新剧'9.3,'重启人生','评分最高日本剧集'9.0,'灌篮高手','评分最高动画片'keep=last:9.8,'地球脉动第三季','评分最高纪录剧集'9.5,'流浪地球2','评分最高华语电影'9.4,'漫长的季节','评分最高华语剧集'9.4,'画江湖之不良人6','评分最高动画剧集'9.3,'1923第一季','评分最高英美新剧'9.3,'重启人生','评分最高日本剧集'9.0,'黑暗荣耀第二季','评分最高韩国剧集'keep=all:9.8,'地球脉动第三季','评分最高纪录剧集'9.5,'流浪地球2','评分最高华语电影'9.4,'漫长的季节','评分最高华语剧集'9.4,'画江湖之不良人6','评分最高动画剧集'9.3,'1923第一季','评分最高英美新剧'9.3,'重启人生','评分最高日本剧集'9.0,'灌篮高手','评分最高动画片'9.0,'梦的背后','评分最高纪录片'9.0,'黑暗荣耀第二季','评分最高韩国剧集'df.nsmallest(2,'Score')keep=first:7.8,'电锯惊魂10','评分最高恐怖片'8.2,'俄罗斯方块','年度冷门佳片'keep=last:7.8,'电锯惊魂10','评分最高恐怖片'8.2,'我爱你!','评分最高爱情片'keep=all:7.8,'电锯惊魂10','评分最高恐怖片'8.2,'俄罗斯方块','年度冷门佳片'8.2,'银河护卫队3','评分最高喜剧片'8.2,'我爱你!','评分最高爱情片'【小技巧】在被调用函数中可用以下代码获取调用函数名:sys._getframe(1).f_code.co_name示例:importsysdefmy_function():frame=sys._getframe(1)function=frame.f_code.co_nameprint(f"Calledfrom{function}")deffunction1():my_function()deffunction2():my_function()function1()function2()'运行运行Out:Calledfromfunction1Calledfromfunction2完
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-11 02:49 , Processed in 0.434680 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表