python常用pandas函数nlargest / nsmallest及其手动实现

news2024/11/25 16:32:49

目录

pandas库

Series和DataFrame

nlargest和nsmallest

用法示例

代替方法

手动实现

模拟代码


pandas库

是Python中一个非常强大的数据处理库,提供了高效的数据分析方法和数据结构。它特别适用于处理具有关系型数据或带标签数据的情况,同时在时间序列分析方面也有着出色的表现。

pandas库广泛应用于数据挖掘和分析、金融和经济分析、科学和工程计算等领域。使用pandas库可以轻松地对数据进行筛选、排序、过滤、清理和变换等操作,并可以进行统计和汇总等分析,从而提高数据处理的效率和精度。pandas库还提供了许多常用的函数和方法,例如数据筛选和排序、数据合并和连接等。

Series和DataFrame

pandas库中最常用的数据类型是Series和DataFrame。Series是一维数组,拥有数据与索引;而DataFrame则是一个类似于表格的二维数据结构,其中储存了多个Series。例如:

>>> import pandas as pd
>>> 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  Score
0      流浪地球 2  评分最高华语电影    9.5
1        奥本海默  评分最高外语电影    8.8
2       俄罗斯方块    年度冷门佳片    8.0
3     银河护卫队 3   评分最高喜剧片    8.4
4        我爱你!   评分最高爱情片    7.9
5     电锯惊魂 10   评分最高恐怖片    7.4
6        灌篮高手   评分最高动画片    8.9
7        梦的背后   评分最高纪录片    9.0
8       漫长的季节  评分最高华语剧集    9.4
9    1923 第一季  评分最高英美新剧    9.3
10   黑暗荣耀 第二季  评分最高韩国剧集    9.0
11       重启人生  评分最高日本剧集    9.3
12  画江湖之不良人 6  评分最高动画剧集    9.4


nlargest和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  Score
13  地球脉动 第三季  评分最高纪录剧集    9.8
0     流浪地球 2  评分最高华语电影    9.5
8      漫长的季节  评分最高华语剧集    9.4
>>> df.nlargest(3, 'Score', keep='last')
        Title     Award  Score
13   地球脉动 第三季  评分最高纪录剧集    9.8
0      流浪地球 2  评分最高华语电影    9.5
12  画江湖之不良人 6  评分最高动画剧集    9.4
>>> df.nlargest(3, 'Score')
       Title     Award  Score
13  地球脉动 第三季  评分最高纪录剧集    9.8
0     流浪地球 2  评分最高华语电影    9.5
8      漫长的季节  评分最高华语剧集    9.4
>>> df.nlargest(3, 'Score', keep='all')
        Title     Award  Score
13   地球脉动 第三季  评分最高纪录剧集    9.8
0      流浪地球 2  评分最高华语电影    9.5
8       漫长的季节  评分最高华语剧集    9.4
12  画江湖之不良人 6  评分最高动画剧集    9.4
>>> df.nsmallest(3, 'Score')
     Title    Award  Score
5  电锯惊魂 10  评分最高恐怖片    7.4
4     我爱你!  评分最高爱情片    7.9
2    俄罗斯方块   年度冷门佳片    8.0

代替方法

df.sort_values()加切片也能实现nlargest和nsmallest的基本功能:

>>> df.sort_values('Score')[-3:][::-1]
        Title     Award  Score
13   地球脉动 第三季  评分最高纪录剧集    9.8
0      流浪地球 2  评分最高华语电影    9.5
12  画江湖之不良人 6  评分最高动画剧集    9.4
>>> df.sort_values('Score')[:3]
     Title    Award  Score
5  电锯惊魂 10  评分最高恐怖片    7.4
4     我爱你!  评分最高爱情片    7.9
2    俄罗斯方块   年度冷门佳片    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=lambda x:x[-1])[-3:][::-1]
[('地球脉动 第三季', '评分最高纪录剧集', 9.8), ('流浪地球 2', '评分最高华语电影', 9.5), ('画江湖之不良人 6', '评分最高动画剧集', 9.4)]
>>> sorted(zip(dic['Title'],dic['Award'],dic['Score']),key=lambda x:x[-1])[:3]
[('电锯惊魂 10', '评分最高恐怖片', 7.4), ('我爱你!', '评分最高爱情片', 7.9), ('俄罗斯方块', '年度冷门佳片', 8.0)]

如果也想实现参数keep=last和all,那就稍微复杂些,你可以试试如何实现?

模拟代码

class DataFrame:
    def __init__(self, dic):
        self.dic = dic
    def nlargest(self, n, Column, keep='first'):
        if n<=0:
            return []
        if Column not in self.dic:
            raise KeyError(f'{Column}')
        if not all([isinstance(i,int) or isinstance(i,float) for i in self.dic[Column]]):
            raise TypeError(f"Column '{Column}' has dtype object, cannot use method 'nlargest' with this dtype")
        lst = [self.dic[i] for i in self.dic.keys()]
        idx = list(self.dic.keys()).index(Column)
        tmp = sorted(zip(*lst) ,key=lambda x:x[idx],reverse=True)
        res = tmp[:n]
        num = tmp[n-1][idx]
        if keep=='first':
            pass
        elif keep=='last':
            for t in tmp[n:]:
                if num==t[idx]:
                    res[-1]=t
                else:
                    break
        elif keep=='all':
            for t in tmp[n:]:
                if num==t[idx]:
                    res.append(t)
                else:
                    break
        else:
            raise ValueError('keep must be either "first", "last" or "all"')
        return res

dic = {
'Title': ['流浪地球 2', '奥本海默', '俄罗斯方块', '银河护卫队 3', '我爱你!', '电锯惊魂 10', '灌篮高手', '梦的背后', '漫长的季节', '1923 第一季', '黑暗荣耀 第二季', '重启人生', '画江湖之不良人 6', '地球脉动 第三季'],
'Award': ['评分最高华语电影', '评分最高外语电影', '年度冷门佳片', '评分最高喜剧片', '评分最高爱情片', '评分最高恐怖片', '评分最高动画片', '评分最高纪录片', '评分最高华语剧集', '评分最高英美新剧', '评分最高韩国剧集', '评分最高日本剧集', '评分最高动画剧集', '评分最高纪录剧集'],
'Score': [9.5, 8.8, 8.0, 8.4, 7.9, 7.4, 9.0, 9.0, 9.4, 9.3, 9.0, 9.3, 9.4, 9.8],
}

df = DataFrame(dic)
kp = 'first', 'last', 'all'
print('3largest:')
for k in kp:
    print(k+':')
    for n in df.nlargest(3, 'Score', keep=k):
        print(n)
print('7largest:')
for k in kp:
    print(k+':')
    for n in df.nlargest(7, 'Score', keep=k):
        print(n)

运行结果:
3largest:
first:
('地球脉动 第三季', '评分最高纪录剧集', 9.8)
('流浪地球 2', '评分最高华语电影', 9.5)
('漫长的季节', '评分最高华语剧集', 9.4)
last:
('地球脉动 第三季', '评分最高纪录剧集', 9.8)
('流浪地球 2', '评分最高华语电影', 9.5)
('画江湖之不良人 6', '评分最高动画剧集', 9.4)
all:
('地球脉动 第三季', '评分最高纪录剧集', 9.8)
('流浪地球 2', '评分最高华语电影', 9.5)
('漫长的季节', '评分最高华语剧集', 9.4)
('画江湖之不良人 6', '评分最高动画剧集', 9.4)
7largest:
first:
('地球脉动 第三季', '评分最高纪录剧集', 9.8)
('流浪地球 2', '评分最高华语电影', 9.5)
('漫长的季节', '评分最高华语剧集', 9.4)
('画江湖之不良人 6', '评分最高动画剧集', 9.4)
('1923 第一季', '评分最高英美新剧', 9.3)
('重启人生', '评分最高日本剧集', 9.3)
('灌篮高手', '评分最高动画片', 9.0)
last:
('地球脉动 第三季', '评分最高纪录剧集', 9.8)
('流浪地球 2', '评分最高华语电影', 9.5)
('漫长的季节', '评分最高华语剧集', 9.4)
('画江湖之不良人 6', '评分最高动画剧集', 9.4)
('1923 第一季', '评分最高英美新剧', 9.3)
('重启人生', '评分最高日本剧集', 9.3)
('黑暗荣耀 第二季', '评分最高韩国剧集', 9.0)
all:
('地球脉动 第三季', '评分最高纪录剧集', 9.8)
('流浪地球 2', '评分最高华语电影', 9.5)
('漫长的季节', '评分最高华语剧集', 9.4)
('画江湖之不良人 6', '评分最高动画剧集', 9.4)
('1923 第一季', '评分最高英美新剧', 9.3)
('重启人生', '评分最高日本剧集', 9.3)
('灌篮高手', '评分最高动画片', 9.0)
('梦的背后', '评分最高纪录片', 9.0)
('黑暗荣耀 第二季', '评分最高韩国剧集', 9.0)
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1433682.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

速过计算机二级python——第六讲:文件操作

第六讲:文件操作 文件夹创建文件夹移动文件夹复制文件夹删除文件夹文件操作文件读取文件写入文件文件夹 创建文件夹 定义创建文件夹函数:chmk_path()定义一个函数 chmk_path(),这个函数的功能是创建文件夹。 首先需要导入操作系统接口模块——os 模块,这个模块中包含某些函…

Linux校准时间 Centos

Linux校准时间 Centos 首先&#xff0c;确保系统中已经安装了tzdata包。如果没有安装&#xff0c;可以使用以下命令安装&#xff1a; sudo yum install tzdata设置系统时区为上海&#xff1a; sudo timedatectl set-timezone Asia/Shanghai验证时区设置是否生效&#xff1a;…

STM32F407 CAN参数配置 250Kbps

本篇CAN参数适用 芯片型号&#xff1a;STM32F407xx系统时钟&#xff1a;168MHz&#xff0c;CAN挂载总线APB1为42M波 特 率 &#xff1a;250Kpbs引脚使用&#xff1a;TX_PB9&#xff0c;RX_PB8&#xff1b;修改为PA11PA12后&#xff0c;参数不变。 步骤一、打勾开启CAN&#xf…

视频业务像素、带宽、存储空间计算

一、像素和分辨率 分辨率的单位通常是像素&#xff08;或点&#xff09;&#xff0c;用水平像素数乘以垂直像素数来表示。例如&#xff0c;一个分辨率为1920 x 1080的屏幕有1920个水平像素和1080个垂直像素。 总像素分辨率公式运算 例如 1920 x 10802073600总约200万 500W≈…

Rocky8+MHA搭建

文章目录 1、MHA 是什么1.1、MHA概念1.2、MHA 组成1.3、MHA特点 2、MHA架构2.1、MHA架构设计2.2、MHA准备工作2.3、服务器基础配置2.3.1、hosts配置2.3.2、修改主机名2.3.3、配置防火墙2.3.4、更新所有服务器2.3.5、所有服务器相互授权 3、mysql8安装3.1、卸载旧mysql3.2、安装…

幻兽帕鲁专用服务器,多人游戏(专用服务器)搭建

玩转幻兽帕鲁服务器&#xff0c;阿里云推出新手0基础一键部署幻兽帕鲁服务器教程&#xff0c;傻瓜式一键部署&#xff0c;3分钟即可成功创建一台Palworld专属服务器&#xff0c;成本仅需26元&#xff0c;阿里云服务器网aliyunfuwuqi.com分享2024年新版基于阿里云搭建幻兽帕鲁服…

react和antd学习笔记

概论 react是前端框架&#xff0c;antd是组件库。前端框架和组件库的区别与联系 nodejs 脚本语言需要一个解析器才能运行&#xff0c;JavaScript是脚本语言&#xff0c;在不同的位置有不一样的解析器&#xff0c;如写入html的js语言&#xff0c;浏览器是它的解析器角色。而对…

网络安全产品之准入控制系统

文章目录 一、什么是准入控制系统二、准入控制系统的主要功能1. 接入设备的身份认证2. 接入设备的安全性检查 三、准入控制系统的工作原理四、准入控制系统的特点五、准入控制系统的部署方式1. 网关模式2. 控制旁路模式 六、准入控制系统的应用场景七、企业如何利用准入控制系统…

大数据 - Spark系列《三》- 加载各种数据源创建RDD

Spark系列文章&#xff1a; 大数据 - Spark系列《一》- 从Hadoop到Spark&#xff1a;大数据计算引擎的演进-CSDN博客 大数据 - Spark系列《二》- 关于Spark在Idea中的一些常用配置-CSDN博客 目录 3.1&#x1f9c0;加载文件(本地) 1. 加载本地文件路径 &#x1f32e;使用te…

倍增法+LCA(C/C++)

目录 1 介绍 2 基本模板 1 介绍 倍增法(binary lifting)&#xff0c;是一种每次将情况翻倍从而将线性处理转化为对数级处理&#xff0c;进而极大优化时间复杂度的方法。 2 基本模板 //预处理复杂度同为O(nlogn),查询时间上&#xff0c;ST表为O(1),线段树为O(logn) #inc…

[C++] 如何使用Visual Studio 2022 + QT6创建桌面应用

安装Visual Studio 2022和C环境 [Visual Studio] 基础教程 - Window10下如何安装VS 2022社区版_visual studio 2022 社区版-CSDN博客 安装QT6开源版 下载开源版本QT Try Qt | 开发应用程序和嵌入式系统 | Qt Open Source Development | Open Source License | Qt 下载完成&…

华为交换机配置Qos

QoS在企业网中的应用 在企业网络中&#xff0c;QoS的一系列技术不要求在同一台设备上应用&#xff0c;而应根据业务需要在不同位置应用。 图5 QoS技术在企业网络中的应用 理论上来说&#xff0c;各层次设备的功能如下&#xff1a; l 接入层业务识别 接入交换机LSW1作为边界…

常用工具类-Arrays

常用工具类-Arrays 数组打印创建数组比较数组数组排序和检索数组转ListsetAll 和 parallelSetAll 数组打印 Arrays提供了toString()方法&#xff0c;可以直接将数组的内容打印出来&#xff0c;极为便捷。 String[] strArr new String[] {"1","2","…

16.docker删除redis缓存数据、redis常用基本命令

1.进入redis容器内部 &#xff08;1&#xff09;筛选过滤出redis容器 docker ps | grep "redis"&#xff08;2&#xff09;进入redis容器 #说明&#xff1a;d24为redis容器iddocker exec -it d24 /bin/bash2.登陆redis (1) 进入redis命令行界面 redis-cli说明&a…

go消息队列RabbitMQ - 订阅模式-direct

1.发布订阅 在Fanout模式中&#xff0c;一条消息&#xff0c;会被所有订阅的队列都消费。但是&#xff0c;在某些场景下&#xff0c;我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。 在Direct模型下&#xff1a; 队列与交换机的绑定&#xff0c;不能…

javaEE - 21( 15000字 Tomcat 和 HTTP 协议入门 -2)

一&#xff1a; HTTP 响应 1.1 认识 “状态码” (status code) 状态码表示访问一个页面的结果. (是访问成功, 还是失败, 还是其他的一些情况…)&#xff0c;以下为常见的状态码. 1.1.1 200 OK 这是一个最常见的状态码, 表示访问成功. 抓包抓到的大部分结果都是 200 HTTP/…

004集—二调数据库标注分子分母模式及统计净面积——arcgis

二调数据库中分子分母标注方法为&#xff1a; 表达式如下&#xff1a; "<und>"& [TBBH] &"</und>" &vbnewline& [DLBM] "<und>"&[DLBM]&"</und>" &vbnewline& [DLMC] &quo…

Anaconda的安装及其配置

一、简介 Anaconda是一个开源的包、环境管理器&#xff0c;主要具有以下功能和特点&#xff1a; 提供conda包管理工具&#xff1a;可以方便地创建、管理和分享Python环境&#xff0c;用户可以根据自己的需要创建不同的环境&#xff0c;每个环境都可以拥有自己的Python版本、库…

【零基础入门TypeScript】Union

目录 语法&#xff1a;Union文字 示例&#xff1a;Union类型变量 示例&#xff1a;Union 类型和函数参数 Union类型和数组 示例&#xff1a;Union类型和数组 TypeScript 1.4 使程序能够组合一种或两种类型。Union类型是表达可以是多种类型之一的值的强大方法。使用管道符号…

【动态规划】【状态压缩】【2次选择】【广度搜索】1494. 并行课程 II

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 状态压缩 广度优先搜索 LeetCode1494. 并行课程 II 给你一个整数 n 表示某所大学里课程的数目&#xff0c;编号为 1 到 n &#xff0c;数组 relations 中&#xff0c; relations[i] [xi, yi] 表示一个先修课的关系&am…