Python数据处理的26个Pandas实用技巧总结

目录
  • 从剪贴板中创建DataFram
  • 将DataFrame划分为两个随机的子集
  • 多种类型过滤DataFrame
  • DataFrame筛选数量最多类别
  • 处理缺失值
  • 一个字符串划分成多列
  • Series扩展成DataFrame
  • 对多个函数进行聚合
  • 聚合结果与DataFrame组合
  • 选取行和列的切片
  • MultiIndexedSeries重塑
  • 创建数据透视表
  • 连续数据转类别数据
  • StyleaDataFrame
  • 额外技巧
    • ProfileaDataFrame

大家好,今天给大家分享一篇 pandas 实用技巧,共计26个,这些技巧在你做数据处理中必不可少,欢迎收藏,喜欢记得点赞、关注。

从剪贴板中创建DataFram

假设你将一些数据储存在Excel或者Google Sheet中,你又想要尽快地将他们读取至DataFrame中。

你需要选择这些数据并复制至剪贴板。然后,你可以使用read_clipboard()函数将他们读取至DataFrame中:

和read_csv()类似,read_clipboard()会自动检测每一列的正确的数据类型:

让我们再复制另外一个数据至剪贴板:

神奇的是,pandas已经将第一列作为索引了:

需要注意的是,如果你想要你的工作在未来可复制,那么read_clipboard()并不值得推荐。

将DataFrame划分为两个随机的子集

假设你想要将一个DataFrame划分为两部分,随机地将75%的行给一个DataFrame,剩下的25%的行给另一个DataFrame。

举例来说,我们的movie ratings这个DataFrame有979行:

我们可以使用sample()函数来随机选取75%的行,并将它们赋值给"movies_1"DataFrame:

接着我们使用drop()函数来舍弃“moive_1”中出现过的行,将剩下的行赋值给"movies_2"DataFrame:

你可以发现总的行数是正确的:

你还可以检查每部电影的索引,或者"moives_1":

或者"moives_2":

需要注意的是,这个方法在索引值不唯一的情况下不起作用。

注: 该方法在机器学习或者深度学习中很有用,因为在模型训练前,我们往往需要将全部数据集按某个比例划分成训练集和测试集。该方法既简单又高效,值得学习和尝试。

多种类型过滤DataFrame

让我们先看一眼movies这个DataFrame:

In [60]:
movies.head()

Out[60]:

其中有一列是genre(类型):

比如我们想要对该DataFrame进行过滤,我们只想显示genre为Action或者Drama或者Western的电影,我们可以使用多个条件,以"or"符号分隔:

In [62]:
movies[(movies.genre == 'Action') |
       (movies.genre == 'Drama') |
       (movies.genre == 'Western')].head()

Out[62]:

但是,你实际上可以使用isin()函数将代码写得更加清晰,将genres列表传递给该函数:

In [64]:
movies[~movies.genre.isin(['Action', 'Drama', 'Western'])].head()

Out[64]:

如果你想要进行相反的过滤,也就是你将吧刚才的三种类型的电影排除掉,那么你可以在过滤条件前加上破浪号:

In [64]:
movies[~movies.genre.isin(['Action', 'Drama', 'Western'])].head()

Out[64]:

这种方法能够起作用是因为在Python中,波浪号表示“not”操作。

DataFrame筛选数量最多类别

假设你想要对movies这个DataFrame通过genre进行过滤,但是只需要前3个数量最多的genre。

我们对genre使用value_counts()函数,并将它保存成counts(type为Series):

该Series的nlargest()函数能够轻松地计算出Series中前3个最大值:

事实上我们在该Series中需要的是索引:

最后,我们将该索引传递给isin()函数,该函数会把它当成genre列表:

In [68]:
movies[movies.genre.isin(counts.nlargest(3).index)].head()

Out[68]:

这样,在DataFrame中只剩下Drame, Comdey, Action这三种类型的电影了。

处理缺失值

让我们来看一看UFO sightings这个DataFrame:

你将会注意到有些值是缺失的

为了找出每一列中有多少值是缺失的,你可以使用isna()函数,然后再使用sum():

isna()会产生一个由True和False组成的DataFrame,sum()会将所有的True值转换为1,False转换为0并把它们加起来。

类似地,你可以通过mean()和isna()函数找出每一列中缺失值的百分比。

如果你想要舍弃那些包含了缺失值的列,你可以使用dropna()函数:

或者你想要舍弃那么缺失值占比超过10%的列,你可以给dropna()设置一个阈值:

len(ufo)返回总行数,我们将它乘以0.9,以告诉pandas保留那些至少90%的值不是缺失值的列。

一个字符串划分成多列

我们先创建另一个新的示例DataFrame:

如果我们需要将“name”这一列划分为三个独立的列,用来表示first, middle, last name呢?我们将会使用str.split()函数,告诉它以空格进行分隔,并将结果扩展成一个DataFrame:

这三列实际上可以通过一行代码保存至原来的DataFrame:

如果我们想要划分一个字符串,但是仅保留其中一个结果列呢?比如说,让我们以", "来划分location这一列:

如果我们只想保留第0列作为city name,我们仅需要选择那一列并保存至DataFrame:

Series扩展成DataFrame

让我们创建一个新的示例DataFrame:

这里有两列,第二列包含了Python中的由整数元素组成的列表。

如果我们想要将第二列扩展成DataFrame,我们可以对那一列使用apply()函数并传递给Series constructor:

通过使用concat()函数,我们可以将原来的DataFrame和新的DataFrame组合起来:

对多个函数进行聚合

让我们来看一眼从Chipotle restaurant chain得到的orders这个DataFrame:

In [82]:
orders.head(10)

Out[82]:

每个订单(order)都有订单号(order_id),包含一行或者多行。为了找出每个订单的总价格,你可以将那个订单号的价格(item_price)加起来。比如,这里是订单号为1的总价格:

如果你想要计算每个订单的总价格,你可以对order_id使用groupby(),再对每个group的item_price进行求和。

但是,事实上你不可能在聚合时仅使用一个函数,比如sum()。**为了对多个函数进行聚合,你可以使用agg()函数,**传给它一个函数列表,比如sum()和count():

这将告诉我们没定订单的总价格和数量。

聚合结果与DataFrame组合

让我们再看一眼orders这个DataFrame:

In [86]:
orders.head(10)

Out[86]:

如果我们想要增加新的一列,用于展示每个订单的总价格呢?回忆一下,我们通过使用sum()函数得到了总价格:

sum()是一个聚合函数,这表明它返回输入数据的精简版本(reduced version )。

换句话说,sum()函数的输出:

比这个函数的输入要小:

解决的办法是使用transform()函数****,它会执行相同的操作但是返回与输入数据相同的形状

我们将这个结果存储至DataFrame中新的一列:

In [91]:
orders['total_price'] = total_price
orders.head(10)

Out[91]:

你可以看到,每个订单的总价格在每一行中显示出来了。

这样我们就能方便地甲酸每个订单的价格占该订单的总价格的百分比:

In [92]:
orders['percent_of_total'] = orders.item_price / orders.total_price
orders.head(10)

In [92]:

选取行和列的切片

让我们看一眼另一个数据集:

In [93]:
titanic.head()

Out[93]:

这就是著名的Titanic数据集,它保存了Titanic上乘客的信息以及他们是否存活。

如果你想要对这个数据集做一个数值方面的总结,你可以使用describe()函数:

但是,这个DataFrame结果可能比你想要的信息显示得更多。

如果你想对这个结果进行过滤,只想显示“五数概括法”(five-number summary)的信息,你可以使用loc函数并传递"min"到"max"的切片:

如果你不是对所有列都感兴趣,你也可以传递列名的切片:

MultiIndexed Series重塑

Titanic数据集的Survived列由1和0组成,因此你可以对这一列计算总的存活率:

如果你想对某个类别,比如“Sex”,计算存活率,你可以使用groupby():

如果你想一次性对两个类别变量计算存活率,你可以对这些类别变量使用groupby():

该结果展示了由Sex和Passenger Class联合起来的存活率。它存储为一个MultiIndexed Series,也就是说它对实际数据有多个索引层级。

这使得该数据难以读取和交互,因此更为方便的是通过unstack()函数将MultiIndexed Series重塑成一个DataFrame:

该DataFrame包含了与MultiIndexed Series一样的数据,不同的是,现在你可以用熟悉的DataFrame的函数对它进行操作。

创建数据透视表

如果你经常使用上述的方法创建DataFrames,你也许会发现用pivot_table()函数更为便捷

想要使用数据透视表,你需要指定索引(index), 列名(columns), (values)和聚合函数(aggregation function)。

数据透视表的另一个好处是,你可以通过****设置margins=True轻松地将行和列都加起来

这个结果既显示了总的存活率,也显示了Sex和Passenger Class的存活率。

最后,你可以创建交叉表(cross-tabulation),只需要将聚合函数由"mean"改为"count":

这个结果展示了每一对类别变量组合后的记录总数。

连续数据转类别数据

让我们来看一下Titanic数据集中的Age那一列:

它现在是连续性数据,但是如果我们想要将它转变成类别数据呢?

一个解决办法是对年龄范围打标签,比如"adult", “young adult”, “child”。实现该功能的最好方式是使用cut()函数

这会对每个值打上标签。0到18岁的打上标签"child",18-25岁的打上标签"young adult",25到99岁的打上标签“adult”。

注意到,该数据类型为类别变量,该类别变量自动排好序了(有序的类别变量)。

Style a DataFrame

上一个技巧在你想要修改整个jupyter notebook中的显示会很有用。但是,一个更灵活和有用的方法是定义特定DataFrame中的格式化(style)。

让我们回到stocks这个DataFrame:

我们可以创建一个格式化字符串的字典,用于对每一列进行格式化。然后将其传递给DataFrame的style.format()函数:

注意到,Date列是month-day-year的格式,Close列包含一个$符号,Volume列包含逗号。

我们可以通过链式调用函数来应用更多的格式化:

我们现在隐藏了索引,将Close列中的最小值高亮成红色,将Close列中的最大值高亮成浅绿色。

这里有另一个DataFrame格式化的例子:

Volume列现在有一个渐变的背景色,你可以轻松地识别出大的和小的数值。

最后一个例子:

现在,Volumn列上有一个条形图,DataFrame上有一个标题。

请注意,还有许多其他的选项你可以用来格式化DataFrame。

额外技巧

Profile a DataFrame

假设你拿到一个新的数据集,你不想要花费太多力气,只是想快速地探索下。那么你可以使用****pandas-profiling这个模块

在你的系统上安装好该模块,然后使用ProfileReport()函数,传递的参数为任何一个DataFrame。它会返回一个互动的HTML报告:

  1. 第一部分为该数据集的总览,以及该数据集可能出现的问题列表
  2. 第二部分为每一列的总结。你可以点击"toggle details"获取更多信息
  3. 第三部分显示列之间的关联热力图
  4. 第四部分为缺失值情况报告
  5. 第五部分显示该数据及的前几行

使用示例如下(只显示第一部分的报告):

以上就是Python数据处理的26个Pandas实用技巧总结的详细内容,更多关于Python Pandas技巧的资料请关注我们其它相关文章!

(0)

相关推荐

  • python数据分析必会的Pandas技巧汇总

    目录 一.Pandas两大数据结构的创建 二.DataFrame常见方法 三.数据索引 四.DataFrame选取和重新组合数据的方法 五.排序 六.相关分析和统计分析 七.分组的方法 八.读写文本格式数据的方法 九.处理缺失数据 十.数据转换 一.Pandas两大数据结构的创建 序号 方法 说明 1 pd.Series(对象,index=[ ]) 创建Series.对象可以是列表\ndarray.字典以及DataFrame中的某一行或某一列 2 pd.DataFrame(data,column

  • Pandas实现数据类型转换的一些小技巧汇总

    前言 Pandas是Python当中重要的数据分析工具,利用Pandas进行数据分析时,确保使用正确的数据类型是非常重要的,否则可能会导致一些不可预知的错误发生. Pandas 的数据类型:数据类型本质上是编程语言用来理解如何存储和操作数据的内部结构.例如,一个程序需要理解你可以将两个数字加起来,比如 5 + 10 得到 15.或者,如果是两个字符串,比如「cat」和「hat」,你可以将它们连接(加)起来得到「cathat」.尚学堂•百战程序员陈老师指出有关 Pandas 数据类型的一个可能令人

  • 11个Python Pandas小技巧让你的工作更高效(附代码实例)

    本文为你介绍Pandas隐藏的炫酷小技巧,我相信这些会对你有所帮助. 或许本文中的某些命令你早已知晓,只是没意识到它还有这种打开方式. Pandas是一个在Python中广泛应用的数据分析包.市面上有很多关于Pandas的经典教程,但本文介绍几个隐藏的炫酷小技巧,我相信这些会对你有所帮助. 1. read_csv 这是读取数据的入门级命令.当要你所读取的数据量特别大时,试着加上这个参数nrows = 5,就可以在载入全部数据前先读取一小部分数据.如此一来,就可以避免选错分隔符这样的错误啦(数据不

  • Pandas爆炸函数的使用技巧

    本文中记录的是如何使用pandas来实现hive中爆炸函数的功能 具体需求 统计每个员工的销售记录: 有作为销售员.跟单员.结单员的任意一种,即可说明参与了该订单的销售记录: 同一个订单中,一个员工参与多次只记为一次 爆炸函数到底实现的是什么功能呢?看图: 张三:参加了订单号1-销售员,订单号2-跟单员.结单员,数量2 李四:参加了订单号1-跟单员.结单员,订单2-销售员,订单号3-跟单员,数量3 王五:参加了订单号3-销售员.结单员,数量1 具体过程 至此,实现了爆炸函数的功能,如下: 到此这

  • 13个Pandas实用技巧,助你提高开发效率

    原作:风控猎人 整理:数据管道 归纳整理了一些工作中常用到的pandas使用技巧,方便更高效地实现数据分析. 1.计算变量缺失率 df=pd.read_csv('titanic_train.csv') def missing_cal(df): """ df :数据集 return:每个变量的缺失率 """ missing_series = df.isnull().sum()/df.shape[0] missing_df = pd.DataFram

  • Pandas数据分析的一些常用小技巧

    Pandas小技巧 import pandas as pd pandas生成数据 d = {"sex": ["male", "female", "male", "female"], "color": ["red", "green", "blue", "yellow"], "age": [1

  • Python数据处理的26个Pandas实用技巧总结

    目录 从剪贴板中创建DataFram 将DataFrame划分为两个随机的子集 多种类型过滤DataFrame DataFrame筛选数量最多类别 处理缺失值 一个字符串划分成多列 Series扩展成DataFrame 对多个函数进行聚合 聚合结果与DataFrame组合 选取行和列的切片 MultiIndexedSeries重塑 创建数据透视表 连续数据转类别数据 StyleaDataFrame 额外技巧 ProfileaDataFrame 大家好,今天给大家分享一篇 pandas 实用技巧,

  • Python中隐藏的五种实用技巧分享

    目录 1. ... 对象 2.解压迭代对象 3.展开的艺术 4.下划线 _ 变量 5.多种用途的else 循环 异常处理 1. ... 对象 没错,你没看错,就是 "..." 在Python中 ... 代表着一个名为 Ellipsis 的对象.根据官方说明,它是一个特殊值,通常可以作为空函数的占位符,或是用于Numpy中的切片操作. 如: def my_awesome_function():     ... 等同于: def my_awesome_function():     Ell

  • Python数据处理的三个实用技巧分享

    目录 1 Pandas 移除某列 2 统计标题单词数 3 Genre 频次统计 我使用的 Pandas 版本如下,顺便也导入 Pandas 库. >>> import pandas as pd >>> pd.__version__ '0.25.1' 在开始前先确保解释器和数据集在同一目录下: >>> import os >>> os.chdir('D://source/dataset') # 这是我的数据集所在目录 >>&

  • python数据处理——对pandas进行数据变频或插值实例

    这里首先要介绍官方文档,对python有了进一步深度的学习的大家们应该会发现,网上不管csdn或者简书上还是什么地方,教程来源基本就是官方文档,所以英语只要还过的去,推荐看官方文档,就算不够好,也可以只看它里面的sample就够了 好了,不说废话,看我的代码: import pandas as pd import numpy as np rng = pd.date_range('20180101', periods=40) ts = pd.Series(np.arange(1,41), inde

  • 一些让Python代码简洁的实用技巧总结

    目录 前言 1. 使用Lambda来修改Pandas数据框中的值 2. 使用f-string来连接字符串 3. 用Zip()函数对多个列表进行迭代 4. 使用列表理解法 5. 对文件对象使用with语句 6. 停止使用方括号来获取字典项, 利用.get()代替 7. 多重赋值 总结 前言 众所周知,编写Python代码在开始时十分容易,但随着你在工具包中添加更多的库,你的脚本可能会有不必要的代码行,变得冗长而混乱.可能短期内能够应付工作,但长期来看,麻烦不小. 在这篇文章中,我将与你分享7个技巧

  • 关于Python中进度条的六个实用技巧分享

    目录 1 简介 2 tqdm中实用的6个特性 2.1 autonotebook自动切换进度条风格 2.2 延迟渲染进度条 2.3 自定义进度条色彩 2.4 自主控制的进度上限 2.5 针对enumerate.zip和map的替代 2.6 设置进度条“用完即逝” 总结 1 简介 费老师我在几年前写过的一篇文章(https://www.jb51.net/article/243348.htm)中,介绍过tqdm这个在当下Python圈子中已然非常流行的进度条库,可以帮助我们为任何具有循环迭代过程的代码

  • Python实用技巧之临时文件的妙用

    目录 创建临时文件 创建临时目录 当我们用Python编写程序时,有时候需要临时存储数据且不希望占用多少内存,亦或是需要写出文件到文件系统供后续程序读取,这些情况下以创建临时文件的方式进行处理,既不会干扰本地文件系统,又安全省事. 而通过使用Python中的标准库tempfile,我们就可以很方便的进行临时文件相关操作,其主要用法有两种: 创建临时文件 tempfile的经典用法之一是使用其TemporaryFile()配合with上下文管理器,在本地文件系统的临时文件目录下创建具有随机名称的文

  • 总结python爬虫抓站的实用技巧

    前言 写过的这些脚本有一个共性,都是和web相关的,总要用到获取链接的一些方法,累积不少爬虫抓站的经验,在此总结一下,那么以后做东西也就不用重复劳动了. 1.最基本的抓站 import urllib2 content = urllib2.urlopen('http://XXXX').read() 2.使用代理服务器 这在某些情况下比较有用,比如IP被封了,或者比如IP访问的次数受到限制等等. import urllib2 proxy_support = urllib2.ProxyHandler(

  • 初学Python实用技巧两则

    本文记录了初学Python常用的两则实用技巧,分享给大家供大家参考之用.具体如下: 1.可变参数 示例代码如下: >>> def powersum(power, *args): ... '''''Return the sum of each argument raised to specified power.''' ... total = 0 ... for i in args: ... total += pow(i, power) ... return total ... >&

随机推荐