Python,Numpy,Pandas…数据科学家必备排序技巧!

Python Pandas 实现数据排序的多种方式 数据排序是数据分析中最基础也是最重要的操作之一。在Python的数据分析生态中,Pandas库提供了强大而灵活的数据排序功能。理解不同排序方法的适用场景掌握基本到高级的排序技巧学会处理特殊排序需求优化大规模数据集的排序性能基本单列排序多列复合排序索引排序自定义排序规则分类数据排序大规模数据排序优化实际应用案例DataFrame: Pandas中的二维表格数据结构Series: Pandas中的一维数组结构索引(Index) 阅读详情

对数据进行分类整理是数据科学家和数据工程师的基础工作。Python会提供许多内置库,优化排序选项。有些库甚至可以同时在GPU上运行。令人惊奇的是,一些排序方法并没有使用之前所述的算法类型,其他方法的执行效果也不如预期。

选择使用哪种库和哪类排序算法着实难办,因为算法的执行变化很快。本文将具体展开讲解,提供一些帮助记忆算法的技巧,分享测速的结果。

 

 

 

 

分好类的茶

Python资源共享群:626017123

开始排序吧!

更新于2019年7月17日:速度测试结果现在包括PyTorch和TensorFlow的GPU执行。TensorFlow还包括tensorflow==2.0.0-beta1和tensorflow-gpu==2.0.0-beta1下的CPU结果。令人感到惊奇的发现是:PyTorch GPU变亮的速度更快,TensorFlow GPU比TensorFlow CPU速度更慢。

有许多不同的基本排序算法。有些比其他执行速度更快、占用内存更小。有些适合处理大数据,还有些可以更好地对特定序列数据进行排排序。可参见下表了解许多常用算法的时间和空间复杂性。

 

 

 

 

图片来自 http://bigocheatsheet.com/

了解基础的算法并不能解决大多数数据科学问题。事实上,过早的优化处理说不定什么时候就会被视为错误源泉。不过需要重复排序大量数据时,知道使用哪个库和哪些关键字参数会十分有用。以下是一个备忘表。

 

 

 

 

 

Google表格可 在此处获取

多年来,许多库的排序算法都发生了变化。用于本文分析的软件版本如下。

  • python 3.6.8
  • numpy 1.16.4
  • pandas 0.24.2
  • tensorflow==2.0.0-beta1
  • #tensorflow-gpu==2.0.0-beta1 slows sorting
  • pytorch 1.1

让我们从基础开始吧!

Python (vanilla版)

 

 

 

 

 

Python包含两个内置排序法。

  • my_list.sort()对原有列表进行排序。改变了列表。sort()返回None。
  • sorted(my_list)生成任何可迭代的排序副本。sorted()返回已排序的迭代。sort()不会改变原始迭代。

sort()应该更快,因为已到位。神奇的是这不是下面测试中的发现。就地排序更危险,因为会改变原始数据。

 

 

 

 

香草味冰激凌

说到vanilla版Python,本文呈现的默认排序顺序都是升序—从小到大。大多数排序方法采用关键字参数,将顺序切换为降序。对大脑来说很不幸,因为每个库的参数名称都不同。

要将vanilla Python中排序方式更改为降序,通过reverse = True.

key可以作为关键字参数来传递,从而创建自己的排序标准。例如,sort(key = len)将按照每个列表项的长度排序。

Vanilla Python中唯一使用的排序算法是Timsort。Timsort会根据要排序的数据特征选择排序方法。举个例子,如果排短列表,就采用插入排序。

Timsort以及Vanilla Python的其他算法都很稳定。这意味着如果有多个相同值,这些数据在排序后仍维持原始顺序。

想要记住sort()与sorted()不同,就记着sorted比sort单词长,并且因复制需要排序时间会更长。虽然下面的结果与传统观念相悖,但助记符仍然起作用。

NumPy

 

 

 

 

 

Numpy是用于科学计算的Python基础库。与vanilla Python一样,有两种执行方式,一种是变异数组,另一种是数据的复制。

  • my_array.sort()改变有序数组并返回已排序数组。
  • np.sort(my_array)返回已排序数组的副本,因此原始数组不会改变。

以下是可选参数。

  • axis:int,可选—要排序的轴。默认值为-1,表示沿最后一个轴排序。
  • kind:{'quicksort','mergesort','heapsort','stable'},可选—排序算法。默认为'quicksort'。详细信息如下。
  • order:str或str的列表,可选—当a是已定义字段的数组时,该参数会指定首先比较哪一字段,其次是哪个等等。可以指定单个字段为字符串,而且不是所有字段都需指定,不过仍需按照未指定字段在dtype中的顺序执行,打破联系。

现在,人们使用的排序算法与根据名字联想的略有不同。通过kind = quicksort意味着排序实际是从introsort算法开始的。

若[它]没有明显进展,则会切换成堆排序算法。执行该操作最坏的情况就是产生快速排序O(n * log(n))。Stable会自动为正在排序的数据类型选择最稳定的排序算法。目前依据数据类型,它与合并排序一起映射到tim排序或基数排序中。API前向兼容性目前抑制了选择执行的能力,并且是不同数据类型的硬连线。添加Timsort是为了更好地处理已完成或几乎排好序的数据。对于随机数据,timsort在处理方式上几乎与mergesort相同。现在timsort用于稳定排序,而在没有其他选择的情况下,quicksort仍为默认排序...'mergesort'和'stable'会映射到整数数据类型的基数排序。 来自Numpy文档 -(部分内容有改动)

其中一点是Numpy提供了比vanilla Python排序算法选项更大的控制范围。第二点是kind关键字值不一定与实际排序类型相对应。最后一点是mergesort和stable值是稳定的,但quicksort和heapsort不是。

Numpy排序是列表中唯一没有用关键字参数来反转排序顺序的操作。幸运的是,这个可快速反转数组顺序:my_arr [:: -1]。

Numpy算法选项在更受欢迎的Pandas中也适用—而且这些功能更容易保持稳定。

Pandas

 

 

 

 

 

通过df.sort_values(by = my_column)对Pandas DataFrame进行排序。有许多可用关键字参数。

  • by:str或str of list,required—要排序的名称或名称列表。如果axis为0或index,那by可能会有索引级别和/或列标签。如果axis为1或columns,则by可能含级别和/或索引标签。
  • axis:{0或index,1或columns},默认为0—排序轴。
  • ascending:bool或bool列表,默认为True—按升序与降序排序。指定多个排序顺序的列表。如果是bool列表,就必须与by参数长度匹配。
  • inplace:bool,默认为False—如果为True,则直接对其执行操作。
  • kind:{quicksort,mergesort,heapsort或stable},默认快速排序—选择排序算法。可另参见ndarray.np.sort了解更多内容。对于DataFrames,此法仅应用于单列或单标签的排序。
  • na_position:{‘first’,‘last’},默认‘last’ - 首先以NaNs作为开头,最后将NaNs作为结尾。

按照相同的句法对Pandas系列进行排序。用Series时,不需要输入by关键字,因为列不多。

Pandas用到了Numpy计算法,动动手指即可轻松获得同等优化的排序选项。但是,Pandas操作需要更多的时间。

按单列排序时的默认设置是Numpy的quicksort。如果排序进度很慢,那么实际为内省排序的quicksort会变为堆排序。Pandas确保多列排序使用Numpy的mergesort。Numpy中的mergesort实际用的是Timsort和Radix排序算法。这些排序算法都很稳定,而且多数列排序中稳定排序是很有必要的。

使用Pandas需记住的关键内容:

  • 函数名称:sort_values()。
  • by= column_name或列名列表。
  • “ ascending”是逆转的关键字。
  • 用mergesort进行稳定排序。

在进行探索性数据分析时,常发现自己是用Series.value_counts()在Pandas DataFrame中对值进行求和排序的。这是一个代码片段,用于每列常用值的求和和排序。

for c in df.columns:  
print(f"---- {c} ---")  
print(df[c].value_counts().head()) 

Dask,实际上是用于大数据的Pandas,到2019年中期还没有实现并行排序,尽管大家一直在讨论这个。

对小数据集进行探索性数据分析,Pandas排序是个不错的选择。当数据很大,想要在GPU上并行搜索时,你也许会想到TensorFlow或PyTorch。

TensorFlow

 

 

 

 

 

TensorFlow是最受欢迎的深度学习框架。以下是TensorFlow 2.0的简介。

tf.sort(my_tensor)返回tensor排序副本。可选参数有:

  • axis:{int,optional}待排序轴。默认值为-1,对最后一个轴进行排序。
  • direction:{ascending or descending}—数值排序的方向。
  • name:{str,optional}—操作的名称。

tf.sort在幕后使用top_k()方法。top_k使用CUB库的CUDA GPU促使并行性更容易实现。正如文档所述“CUB为CUDA编程模型的每一项程序都提供了最先进、可重复利用的软件组件。”TensorFlow通过CUB在GPU上使用基数排序。

为了使GPU能够满足TensorFlow 2.0,你需要!pip3 install tensorflow-gpu==2.0.0-beta1。我们会从下面的评论看到,如果你要进行排序,你可能想坚持tensorflow==2.0.0-beta1。

使用下面一小段代码来检查代码的每一行是否都能在CPU 或GPU中运行:

tf.debugging.set_log_device_placement(True) 

为了详述你想要使用GPU,使用下面代码:

with tf.device('/GPU:0'):  
%time tf.sort(my_tf_tensor) 

使用 with tf.device('/CPU:0'):为了使用CPU。

假如在TensorFlow中工作,tf.sort()是非常直观的记忆和使用方法。只需记住direction = descending可转换排序顺序。

PyTorch

 

 

 

 

 

torch.sort(my_tensor)返回tensor排序副本。可选参数有:

  • dim:{int,optional} - 待排序维度
  • descending:{bool,optional} - 控制排序顺序(升序或降序)。
  • out:{tuple,optional} - (Tensor,LongTensor)的输出元组,可以作为输出缓冲区。

通过将.cuda()粘贴到张量的末尾来指定要使用GPU进行排序。

gpu_tensor=my_pytorch_tensor.cuda()  
%time torch.sort(gpu_tensor) 

一些分析表明,如果任何大于100万行乘以100,000列的数据集要排序,PyTorch将通过Thrust利用分段式并行排序。

不幸的是,当我们试图通过Google Colab中的Numpy创建1.1M x 100K随机数据点时,发现内存已不足。然后尝试了416 MB RAM的GCP,依旧没有内存。

分段排序和位置排序是mergesort的高性能体现,处理非均匀随机数据。分段排序使我们能够并行排序许多长度可变数组。 https://moderngpu.github.io/segsort.html

Thrust作为并行算法库,实现了GPU与多核CPU之间的联系。提供了排序原语,可自动选择最有效的执行方式。TensorFlow使用的CUB库会用来包装Thrust。PyTorch和TensorFlow在操作时GPU分类法相似 - 无论选择何种。

与TensorFlow一样,PyTorch的排序方法记起来相当容易:torch.sort()。唯一费脑子的是排序值的方向:TensorFlow使用direction,而PyTorch使用descending。

虽然用GPU进行排序对于非常大的数据集来说可能是一个很好的选择,但直接在SQL中对数据进行排序也是可以的。

SQL

SQL中的排序通常非常快,特别是在内存中执行时。

SQL很规范,但没有规定某操作必须使用哪种排序算法。Postgres使用磁盘合并排序,堆排序或快速排序,视情况而定。如果内存够,在内存中排序会更快。通过work_mem设置增加排序的可用内存。

其他SQL的执行使用不同排序算法。例如,根据Stack Overflow的回答,谷歌BigQuery的内省排序采取了一些措施。

SQL中的排序由ORDER BY命令执行。这种句法不同于所有使用单词sort的Python排序执行。其实更容易记住SQR语句与ODER BY,因为非常独特。

为使排序降序,请用关键字DESC。因此,按字母顺序从最后一个到第一个反馈给客户的查询如下所示:

  • SELECT Names FROM Customers
  • ORDER BY Names DESC;

比较

对于上面的每个Python库,我们对wall time进行了分析,以便在单列,单数组或单列表中对相同的1,000,000个数据点进行排序。同时使用了配有T4 GPU的Google Colab Jupyter笔记本。

 

 

 

 

数据来源: https://colab.research.google.com/drive/1NNarscUZHUnQ5v-FjbfJmB5D3kyyq9Av

观察

  • 对于Numpy和Pandas,inplace比复制数据更快。这并不奇怪。
  • Pandas默认快速排序相当快。
  • 大多数Pandas功能相对较慢。
  • TensorFlow操作相当快。
  • Python inplace排序慢得出奇。比Numpy inplace mergesort和TensorFlow慢了10倍。曾多次对其进行测试(使用不同的数据)来确认这不是一个异常现象。

重申,这只是一个小测试。绝对不是决定性的。

Wrap

通常不需要自定义排序。选择很多。一般不会采用单一的排序方法。相反,首先对数据进行评估,然后用效果更好的排序算法。如果排序进展不快,执行操作时也会自行改变算法。

在本文中,你已经了解了如何在Python数据科学堆和SQL中的每个板块里进行排序。

只需要记住选择哪个选项以及如何调用它们。可用上面的备忘表,节省时间。大致建议如下:

  • 使用默认的Pandas sort_values()来探索相对较小的数据集。
  • 数据集较大或运行速度较高时,尝试Numpy的就地合并,PyTorch或TensorFlow并行GPU方式或SQL。
numpy-1.22.4+vanilla-cp311-cp311-win-amd64-whl 该资源为numpy-1.22.4+vanilla-cp311-cp311-win_amd64.whl,欢迎下载使用哦! 立即下载

相关推荐

numpy-1.19.5+vanilla-cp36-cp36m-win-amd64.zip

适用平台:windows x64 文件格式:whl 安装方式:切换到whl路径,执行pip install [whl文件名]

Python,Numpy,Pandas…数据科学家必备排序技巧

全文共6168字,预计学习时长12分钟 对数据进行分类整理是数据科学家和数据工程师的基础工作。Python会提供许多内置库,优化排序选项。有些库甚至可以同时在GPU上运行。令人惊奇的是,一些排序方法并没有使用之前所述的算法类型,其他方法的执行效果也不如预期。 选择使用哪种库和哪类排序算法着实难办,因为算法的执行变化很快。本文将具体展开讲解,提供一些帮助记忆算法的技巧,分享测速的结果...

读芯术的博客 905

numpy-1.20.3+vanilla-cp37-cp37m-win32

numpy-1.20.3+vanilla-cp37-cp37m-win32

python 排序方法

快速排序的基本思想是选择一个基准元素,将列表分成两个部分,一部分包含所有小于基准元素的元素,另一部分包含所有大于基准元素的元素,然后递归地对这两部分进行排序。这样可以避免不必要的比较和交换操作,提高排序的效率。冒泡排序是一种简单的排序算法,它的基本思想是通过不断比较相邻的元素,将较大的元素向后移动,较小的元素向前移动,从而实现排序的目的。在这个例子中,我们首先使用heapify函数将列表arr转换为堆,然后使用heappop函数从堆中取出最小的元素,并将它们添加到一个新的列表中,最终得到排序后的结果。

frank201101的博客 426

numpy-1.22.4+vanilla-cp38-cp38-win_amd64.whl

numpy-1.22.4+vanilla-cp38-cp38-win_amd64.whl

BLDC六步换相驱动实战:从霍尔真值表到PWM调速的代码实现

本文详细解析了BLDC六步换相驱动原理,从霍尔真值表解读到PWM调速的代码实现,提供了基于STM32的实战方案。重点介绍了霍尔信号解码、换相状态机设计以及PWM动态调速策略,帮助开发者快速掌握无刷电机驱动技术。

weixin_28273593的博客 212

Python 数据处理 —— pandas 排序

方法修改数据不会带来任何副作用,几乎所有方法都返回一个新对象,而原始对象保持不变。方法,会复制底层数据(不包括轴索引,因为轴索引不可变),并返回一个新的对象。的名称一样,则会发出警告,并且列名优先。参数来接受一个可调用的函数,会将其应用于要排序的值上。:几乎不需要复制对象。每列的名称或类型可用于将不同的函数应用于不同的列。参数可用于指定需要排序的一列或多列。按索引排序还支持接受可调用函数的。参数,以将其应用于要排序的索引。的值,应该返回具有相同形状的。参数的字符串可以列名或索引的。需要明确的一点是,使用。

dxs18459111694的博客 1843

【汽车故障诊断2】从标准到实战:解码DTC格式背后的诊断逻辑

本文深入解析汽车诊断故障码(DTC)的格式与逻辑,对比了OBD-II标准(如ISO 15031-6)的5字符格式与UDS协议(ISO 14229-1)下更丰富的3字节格式。文章从国际标准出发,结合实战案例,阐述了DTC如何作为汽车电子系统的“体检报告”,帮助工程师和维修技师精准定位故障,并详细解读了UDS 19服务如何读取和管理DTC状态。

berry的博客 713

【Python】Pandas数据排序实现

公众号:尤而小屋作者:Peter编辑:Peter在以前的一篇文章 图解Pandas的排序机制sort_values 详细介绍了如何使用pandas的内置函数sort_values来...

fengdu78的博客 3498

Sipeed麦克风阵列板练习

麦克风阵列板 Maix Dock Sipeed

sunshinebigbig的博客 3836

百度地图街景图像批量获取

由于个人研究需要在最近试了一下使用API获取百度地图街景图片,在此介绍一下基于我个人需求的百度街景批量获取方法,本文以Python编码作为主要方法,如果对零编码工具有需要的可以关注一下UA城市分析小组刚刚发布的街景图片获取工具。 街景图像用作区域细粒度空间指标测度需要解决几个问题。 1. 首先就是调用额度的限制,现在百度对于个人认证开发者每天可用的街景图像调用额度为100张,在不考虑购买额度上限(1万张600元,其实有经费的前提下可以直接考虑钞能力)的情况下动辄几千上万张的爬取数量会大大增加需要爬取的时间周

boycetoon29的博客 1万+

深度学习:优化器工厂,各种优化器介绍,numpy实现深度学习(一)

简单概括参数更新: 1、更新方向不是简单地取为梯度 2、学习速率不是简单地取为常值 都是使用局部梯度delta来更新参数: 我们一般使用修正后的delta: 优化器 Vanilla Update ...

weixin_40759186的博客 774

如何用IDEA查看jar包中代码

我们在使用Java进行开放时经常会需要下载些第三方的jar包进行相应的开发。有时候相关jar包的使用文档不足,满足不了我们的特定开发使用要求,这就需要我们查看jar包内的相关代码逻辑,本文将基于IDEA工具介绍如何查看相关jar包的代码逻辑

mystonelxj的博客 2284

python numpy pandas 书 全_Python,Numpy,Pandas……数据科学家必备排序技巧

全文共6168字,预计学习时长12分钟对数据进行分类整理是数据科学家和数据工程师的基础工作。Python会提供许多内置库,优化排序选项。有些库甚至可以同时在GPU上运行。令人惊奇的是,一些排序方法并没有使用之前所述的算法类型,其他方法的执行效果也不如预期。选择使用哪种库和哪类排序算法着实难办,因为算法的执行变化很快。本文将具体展开讲解,提供一些帮助记忆算法的技巧,分享测速的结果。分好类的茶开始排序...

weixin_39963096的博客 221

MIL图像处理那些事:MIL的安装和MIL工具箱

MIL图像处理那些事:MIL的安装和测试,如何用C#使用MIL

十多年IT经验,专注机器视觉,智能制造半导体行业 5275

〔重庆理工大学〕大学物理实验--变温霍耳效应及其参数测定

每个老师要求不同,实验报告内容和数据仅供参考。

Pretty Boy Fox的博客 3044

element表格多列排序_Python,Numpy,Pandas…数据科学家必备排序技巧

全文共6168字,预计学习时长12分钟对数据进行分类整理是数据科学家和数据工程师的基础工作。Python会提供许多内置库,优化排序选项。有些库甚至可以同时在GPU上运行。令人惊奇的是,一些排序方法并没有使用之前所述的算法类型,其他方法的执行效果也不如预期。选择使用哪种库和哪类排序算法着实难办,因为算法的执行变化很快。本文将具体展开讲解,提供一些帮助记忆算法的技巧,分享测速的结果。分好类的茶开始排序...

weixin_39673184的博客 308

手把手教你 Ubuntu 24.04 离线安装 Ollama

本文介绍 Ubuntu 下离线安装 Ollama 并使用 Ollama 部署 llama3.1-70b 大模型

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 1021

list排序sort降序_数据科学家的排序技巧

原题 | Surprising Sorting Tips for Data Scientists作者 | Jeff Hale原文 | https://towardsdatascience.com/surprising-sorting-tips-for-data-scientists-9c360776d7e声明 | 翻译是出于交流学习的目的,欢迎转载,但请保留本文出处,请勿用作商业或者非法用途导读这...

weixin_39699746的博客 1185

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

数据科学家令人惊叹的排序技巧

2019 年第 80 篇文章,总第 104 篇文章本文大约7800 字,阅读大约需要20分钟原题 | Surprising Sorting Tips for Data Scientists作者 | Jeff Hale原文 | https://towardsdatascience.com/surprising-sorting-tips-for-data-scientists-9c360776d7e...

AI 算法笔记 773

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Python数据分析:NumPy、Pandas和Matplotlib的使用和实践

本章将对前面的内容进行总结和回顾,同时展望未来的发展方向。我们将介绍如何深入学习这些库,以及如何使用它们来解决更加复杂的数据分析和可视化问题。本节将对前面的内容进行总结和回顾,包括NumPy、Pandas和Matplotlib的基本用法和实践,以及它们的组合使用来实现数据分析和可视化。

baidu_38876334的博客 3721

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

arraylist从大到小排序_数据科学家的排序技巧

作者 | Jeff Hale原文 | https://towardsdatascience.com/surprising-sorting-tips-for-data-scientists-9c360776d7e译者 | kbsc13("算法猿的成长"公众号作者)声明 | 翻译是出于交流学习的目的,欢迎转载,但请保留本文出于,请勿用作商业或者非法用途导读这篇文章介绍了 Python 中几个常用库的排...

weixin_39700063的博客 307

python pandas numpy matplotlib 常用方法及函数

python pandas numpy matplotlib 常用方法及函数 import numpy as np import pandas as pd import matplotlib.pyplot as plt ---------------numpy----------------------- arr = np.array([1,2,3], dtype=np.float64) np.z...

weixin_45083739的博客 611

排序 np_数据科学家的排序技巧

原题 | Surprising Sorting Tips for Data Scientists作者 | Jeff Hale原文 | https://towardsdatascience.com/surprising-sorting-tips-for-data-scientists-9c360776d7e声明 | 翻译是出于交流学习的目的,欢迎转载,但请保留本文出处,请勿用作商业或者非法用途导读这...

weixin_35780426的博客 182
上一篇: Python基础-你必备的语言技能包!
下一篇: 如何使用 python 接入虹软 ArcFace SDK!
普通网友
博客等级 码龄7年 438粉丝 263原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值