0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

25个Pandas实用技巧

数据分析与开发 来源:数据分析与开发 作者:数据分析与开发 2022-03-14 10:33 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

从剪贴板中创建DataFrame

假设你将一些数据储存在Excel或者Google Sheet中,你又想要尽快地将他们读取至DataFrame中。你需要选择这些数据并复制至剪贴板。然后,你可以使用read_clipboard()函数将他们读取至DataFrame中:

5ea29752-9753-11ec-952b-dac502259ad0.png

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

5eb8935e-9753-11ec-952b-dac502259ad0.png

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

5ed0165a-9753-11ec-952b-dac502259ad0.png

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

5ee93a04-9753-11ec-952b-dac502259ad0.png

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

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

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


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

5efb83b2-9753-11ec-952b-dac502259ad0.png

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

5f0fdea2-9753-11ec-952b-dac502259ad0.png

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

5f1dea2e-9753-11ec-952b-dac502259ad0.png

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

5f3aee58-9753-11ec-952b-dac502259ad0.png

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

5f537180-9753-11ec-952b-dac502259ad0.png

或者"moives_2":

5f6591da-9753-11ec-952b-dac502259ad0.png

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

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

多种类型过滤DataFrame

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

In[60]: movies.head() Out[60]:

5f7f92ce-9753-11ec-952b-dac502259ad0.png

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

5f9f00d2-9753-11ec-952b-dac502259ad0.png

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

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

5fae1c66-9753-11ec-952b-dac502259ad0.png

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

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

5fc0b600-9753-11ec-952b-dac502259ad0.png

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

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

5fdcd3b2-9753-11ec-952b-dac502259ad0.png

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

DataFrame筛选数量最多类别

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

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

5ff3f7cc-9753-11ec-952b-dac502259ad0.png

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

600652fa-9753-11ec-952b-dac502259ad0.png

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

601a6f06-9753-11ec-952b-dac502259ad0.png

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

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

603124e4-9753-11ec-952b-dac502259ad0.png

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

处理缺失值

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

604f00e0-9753-11ec-952b-dac502259ad0.png

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


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

606259b0-9753-11ec-952b-dac502259ad0.png

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

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

607d0116-9753-11ec-952b-dac502259ad0.png

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

6099d49e-9753-11ec-952b-dac502259ad0.png

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

60aa4b76-9753-11ec-952b-dac502259ad0.png

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

一个字符串划分成多列

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

60bab056-9753-11ec-952b-dac502259ad0.png

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

60cecbc2-9753-11ec-952b-dac502259ad0.png

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

60e7b484-9753-11ec-952b-dac502259ad0.png

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

60f8c8c8-9753-11ec-952b-dac502259ad0.png

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

611277fa-9753-11ec-952b-dac502259ad0.png

Series扩展成DataFrame

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

61276232-9753-11ec-952b-dac502259ad0.png

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

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

6140eb58-9753-11ec-952b-dac502259ad0.png

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

61547d1c-9753-11ec-952b-dac502259ad0.png

对多个函数进行聚合

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

In[82]: orders.head(10) Out[82]:

616c10c6-9753-11ec-952b-dac502259ad0.png

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

617f1252-9753-11ec-952b-dac502259ad0.png

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

61940edc-9753-11ec-952b-dac502259ad0.png

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

61ab086c-9753-11ec-952b-dac502259ad0.png

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

聚合结果与DataFrame组合

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

In[86]: orders.head(10) Out[86]:

61c83112-9753-11ec-952b-dac502259ad0.png

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

61dab968-9753-11ec-952b-dac502259ad0.png

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


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

61f8537e-9753-11ec-952b-dac502259ad0.png

比这个函数的输入要小:

6209a49e-9753-11ec-952b-dac502259ad0.png

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

622b0238-9753-11ec-952b-dac502259ad0.png

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

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

62455ae8-9753-11ec-952b-dac502259ad0.png

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

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

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

626ae0ce-9753-11ec-952b-dac502259ad0.png

选取行和列的切片

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

In[93]: titanic.head() Out[93]:

627dcec8-9753-11ec-952b-dac502259ad0.png

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


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

629353ec-9753-11ec-952b-dac502259ad0.png

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

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

62a1f2bc-9753-11ec-952b-dac502259ad0.png

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

62b9511e-9753-11ec-952b-dac502259ad0.png

MultiIndexed Series重塑

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

62d0a3dc-9753-11ec-952b-dac502259ad0.png

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

62e3d880-9753-11ec-952b-dac502259ad0.png

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

62f83d34-9753-11ec-952b-dac502259ad0.png

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


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

63174580-9753-11ec-952b-dac502259ad0.png

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

创建数据透视表

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

6331390e-9753-11ec-952b-dac502259ad0.png

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


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

634ae444-9753-11ec-952b-dac502259ad0.png

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


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

63600a68-9753-11ec-952b-dac502259ad0.png

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

连续数据转类别数据

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

63772a54-9753-11ec-952b-dac502259ad0.png

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

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

638a4300-9753-11ec-952b-dac502259ad0.png

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

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

Style a DataFrame

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


让我们回到stocks这个DataFrame:

63a1621a-9753-11ec-952b-dac502259ad0.png

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

63ca81cc-9753-11ec-952b-dac502259ad0.png

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


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

63dbfa2e-9753-11ec-952b-dac502259ad0.png

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


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

63f42e46-9753-11ec-952b-dac502259ad0.png

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


最后一个例子:

641b57f0-9753-11ec-952b-dac502259ad0.png

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

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

额外技巧

Profile a DataFrame

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

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

第一部分为该数据集的总览,以及该数据集可能出现的问题列表

第二部分为每一列的总结。你可以点击"toggle details"获取更多信息

第三部分显示列之间的关联热力图

第四部分为缺失值情况报告

第五部分显示该数据及的前几行

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

642bc072-9753-11ec-952b-dac502259ad0.png

原文链接:
https://nbviewer.jupyter.org/github/justmarkham/pandas-videos/blob/master/top_25_pandas_tricks.ipynb

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4406

    浏览量

    66829
  • 机器学习
    +关注

    关注

    66

    文章

    8541

    浏览量

    136230

原文标题:这 25 个 Pandas 实用技巧你都会吗

文章出处:【微信号:DBDevs,微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    W25Q128JVSIM与GD25Q128ESIGR引脚兼容分析

    华邦W25Q128JVSIM作为常用的128Mbit SPI NOR Flash芯片,其兼容替代方案兆易创新GD25Q128ESIGR已获得批量客户的认可及使用。
    的头像 发表于 10-13 09:33 626次阅读
    W<b class='flag-5'>25</b>Q128JVSIM与GD<b class='flag-5'>25</b>Q128ESIGR引脚兼容分析

    便携式近红外光谱仪选购指南:5关键参数与实用技巧

    :如何选择一款既精准又适合实际需求的便携式近红外光谱仪?本文将聚焦于便携式近红外光谱仪的选购指南,详细解析5关键参数,并结合实用技巧,帮助用户做出明智采购决策。您是否也有类似疑问?让我们一起深入了解吧! 1. 便携式近红
    的头像 发表于 10-11 15:05 237次阅读

    超声波清洗机的工作原理与实用技巧全解析

    清洗机凭借其高效、环保的清洗特点,正在成为各行业清洗的新宠。许多用户对超声波清洗机的工作原理、使用方法及其优势有疑问,本文将对此进行深入解析,并提供实用技巧,帮助
    的头像 发表于 08-19 16:35 845次阅读
    超声波清洗机的工作原理与<b class='flag-5'>实用技巧</b>全解析

    便携式矿物地物光谱仪选购指南:关键指标与实用技巧揭秘

    选择和技术参数的考量。因此,了解这些仪器的关键指标和实用技巧,能帮助您做出更明智的决策,满足各类矿物分析需求。 定义与工作原理 便携式矿物地物光谱仪是一种便于现场使用的设备,主要利用地物光谱技术进行矿物成分分析
    的头像 发表于 08-19 11:31 542次阅读
    便携式矿物地物光谱仪选购指南:关键指标与<b class='flag-5'>实用技巧</b>揭秘

    高效管理Kubernetes集群的实用技巧

    作为一名经验丰富的运维工程师,我深知在日常的Kubernetes集群管理中,熟练掌握kubectl命令是提升工作效率的关键。今天,我将分享15经过实战检验的kubectl实用技巧,帮助你像艺术家一样优雅地管理K8s集群。
    的头像 发表于 08-13 15:57 601次阅读

    DP-25差分探头的介绍与注意事项

    DP-25 差分探头提供一安全的绝缘仪器给示波器使用,它可以转换由高输入的差动电压(≦1400Vp-p)进入一低电压(≦7.0V),并且显示波形在示波器上,使用频率高达25MHz
    的头像 发表于 07-21 17:22 549次阅读
    DP-<b class='flag-5'>25</b>差分探头的介绍与注意事项

    W25X16W25X32\W25X64 数据手册

    电子发烧友网站提供《W25X16W25X32\W25X64 数据手册.pdf》资料免费下载
    发表于 07-10 16:10 4次下载

    成功使用工业化超声波清洗设备的七实用技巧

    成功使用工业化超声波清洗设备的七实用技巧工业化超声波清洗设备在现代制造业中起到至关重要的作用,但要充分发挥它们的效能,需要掌握一些实用技巧。本文将为您介绍成功使用工业化超声波清洗设备的七
    的头像 发表于 06-25 17:33 465次阅读
    成功使用工业化超声波清洗设备的七<b class='flag-5'>个</b><b class='flag-5'>实用技巧</b>

    泰克示波器MSO58B光标横竖切换操作指南与实用技巧

    是提升测量效率与精度的关键操作之一。本文将详细介绍MSO58B示波器的光标横竖切换方法、应用场景及实用技巧,帮助用户高效掌握这一核心功能。   一、光标切换的基本操作步骤 泰克MSO58B的光标切换操作相对直观,可通过以下步骤实现: 1. 连
    的头像 发表于 05-26 17:08 1221次阅读
    泰克示波器MSO58B光标横竖切换操作指南与<b class='flag-5'>实用技巧</b>

    Altium Designer AD 25 软件安装包下载

    Altium Designer 25 隆重登场!借助实时 PCB 协同设计、多板和线束功能、高级仿真和无缝 MCAD 集成等强大的新功能,彻底改变您的设计流程。 AD25 非常适合复杂的项目,它以前所未有的方式连接设计团队,在一
    发表于 05-22 16:45 46次下载

    德索工程师教您快速排查 BNC 连接器接线故障的实用技巧

    通过外观检查、连接状态检查、电气性能测试以及替换法等一系列实用技巧的综合运用,就能够快速、准确地排查出BNC连接器的接线故障,为设备的正常运行和信号的稳定传输保驾护航。在实际操作过程中,大家可以根据具体情况灵活运用这些技巧,相信一定能够轻松应对各种BNC连接器接线故障问题。
    的头像 发表于 04-07 09:32 855次阅读
    德索工程师教您快速排查 BNC 连接器接线故障的<b class='flag-5'>实用技巧</b>

    NNV25-05S05ANT NNV25-05S05ANT

    电子发烧友网为你提供AIPULNION(AIPULNION)NNV25-05S05ANT相关产品参数、数据手册,更有NNV25-05S05ANT的引脚图、接线图、封装手册、中文资料、英文资料,NNV25-05S05ANT真值表,
    发表于 03-19 18:36
    NNV<b class='flag-5'>25</b>-05S05ANT NNV<b class='flag-5'>25</b>-05S05ANT

    DIY 达人必看:BNC 连接器接线工具套装精选及实用技巧全解析

    接结束后,及时使用吸锡器清理多余焊锡,防止因焊锡残留造成短路等问题,确保焊接质量可靠。 拥有一套适配的 BNC 连接器接线工具套装,并熟练掌握上述实用技巧,DIY 爱好者在进行音视频设备连接时,便能游刃有余,显著提升接线质量,保障设备稳定运行,尽情享受 DIY 带来的无限乐趣与成就感。
    的头像 发表于 03-12 09:48 763次阅读
    DIY 达人必看:BNC 连接器接线工具套装精选及<b class='flag-5'>实用技巧</b>全解析

    电机控制器EMC测试整改:专家视角与实用技巧

    深圳南柯电子|电机控制器EMC测试整改:专家视角与实用技巧
    的头像 发表于 02-19 10:53 904次阅读
    电机控制器EMC测试整改:专家视角与<b class='flag-5'>实用技巧</b>

    将AINN和AGND接在了一起,请问AMC1306M25的AGND的地和隔离电源的地是一地吗?

    我正在评估AMC1306M25,有问题想要请教: 我做了一 隔离电源,输出5V,将5V电源供给AMC1306M25,AMC1306M25
    发表于 12-23 08:25