个性化阅读
专注于IT技术分析

Pandas教程:Python中的DataFrame

点击下载

本文概述

Pandas教程:Python中的DataFrame2

Pandas是用于数据科学的流行Python软件包, 这有充分的理由:它提供了强大, 可表达和灵活的数据结构, 这些数据结构使数据的操作和分析变得容易。 DataFrame是这些结构之一。

本教程通过解决11个最流行的问题, 涵盖了从基本操作到高级操作的Pandas DataFrames, 以便你理解并避免对你之前的Pythonista的疑问。

内容

  1. 如何创建熊猫数据框
  2. 如何从数据框选择索引或列
  3. 如何向数据框添加索引, 行或列
  4. 如何从数据框删除索引, 行或列
  5. 如何重命名数据框的列或索引
  6. 如何格式化DataFrame中的数据
  7. 如何创建一个空的DataFrame
  8. 熊猫在导入数据时会识别日期吗?
  9. 何时, 为什么以及如何重塑DataFrame
  10. 如何在DataFrame上迭代
  11. 如何将DataFrame写入文件

(有关更多练习, 请免费尝试此Pandas DataFrames课程的第一章!)

什么是熊猫数据框?

在开始之前, 让我们简要回顾一下什么是DataFrame。

那些熟悉R的人都知道数据框是一种将数据存储在矩形网格中的方法, 可以很容易地对其进行概述。这些网格的每一行对应于一个实例的度量或值, 而每一列都是一个包含特定变量数据的向量。这意味着数据框的行不需要包含但可以包含相同类型的值:它们可以是数字, 字符, 逻辑等。

现在, Python中的DataFrame非常相似:它们与Pandas库一起提供, 并且它们被定义为带有潜在不同类型的列的二维标记数据结构。

通常, 你可以说Pandas DataFrame由三个主要组件组成:数据, 索引和列。

  1. 首先, DataFrame可以包含以下数据:
  • 熊猫数据框
  • 熊猫系列:一维标记数组, 能够保存带有轴标签或索引的任何数据类型。 Series对象的一个​​示例是DataFrame中的一列。
  • NumPy ndarray, 可以是记录或结构化的
  • 二维ndarray
  • 一维ndarray的字典, 列表, 字典或序列。

注意np.ndarray和np.array()之间的区别。前者是实际的数据类型, 而后者是从其他数据结构制作数组的功能。

结构化数组允许用户通过命名字段来操作数据:在下面的示例中, 创建了一个由三个元组组成的结构化数组。每个元组的第一个元素将被称为foo并将为int类型, 而第二个元素将被命名为bar并将为一个浮点数。

另一方面, 记录数组扩展了结构化数组的属性。它们允许用户按属性而不是按索引访问结构化数组的字段。你将在下面看到在r2记录数组中访问foo值。

一个例子:

  1. 除了数据, 你还可以为DataFrame指定索引和列名称。一方面, 索引指示行的差异, 而列名指示列的差异。稍后你将看到, 在处理数据时, DataFrame的这两个组件将派上用场。

如果你仍然对Pandas DataFrame以及它们与NumPy数组或Series之类的其他数据结构有何不同尚存疑问, 则可以观看下面的小型演示文稿:

请注意, 在大多数情况下, 本文中已经加载了所需的库。Pandas库通常以别名pd导入, 而NumPy库则以np加载。请记住, 当你在自己的数据科学环境中进行编码时, 你不应忘记此导入步骤, 你可以这样编写:


import numpy as np
import pandas as pd

现在你已经毫无疑问地知道什么是DataFrame, 它们可以做什么以及它们与其他结构的不同之处, 现在是时候解决用户使用它们时最常见的问题了!

1.如何创建熊猫数据框

显然, 在使用Python进行数据处理时, 几乎想要做的任何事情都是制作DataFrames的第一步。有时, 你可能想从头开始, 但是你也可以将其他数据结构(例如列表或NumPy数组)转换为Pandas DataFrames。在本节中, 你将仅讨论后者。但是, 如果你想了解更多有关制作空的DataFrame的信息, 以便以后可以填充数据, 请转到问题7。

NumPy ndarray就是其中之一, 它可以作为制作” DataFrame”的输入的众多要素之一。要从NumPy数组制作数据帧, 你可以将其传递给data参数中的DataFrame()函数。

请注意上面的代码块如何从NumPy数组中选择元素来构造DataFrame:首先选择包含在以Row1和Row2开头的列表中的值, 然后选择索引或行号Row1和Row2, 然后列名称Col1和Col2。

接下来, 你还将看到在上面的srcmini Light块中, 你打印了一些数据。这与子集2D NumPy数组的工作原理相同:首先指示要在其中查找数据的行, 然后指示该列。不要忘记索引从0开始!对于上面示例中的数据, 你可以查找索引1的行以结束, 然后选择索引1之后的所有元素。结果, 最终选择了1、2、3和4。

对于DataFrame()可以接受作为输入的所有结构, 这种制作DataFrames的方法都是相同的。

在下面的代码块中尝试一下:

请记住, Pandas库已经为你导入为pd。

请注意, 你Series(和DataFrame)的索引包含原始字典的键, 但是它们是排序的:比利时将是索引, 索引为0, 美国是索引, 索引为3。

创建DataFrame之后, 你可能想了解更多有关它的信息。你可以将shape属性或len()函数与.index属性结合使用:

这两个选项为你提供有关DataFrame的信息略有不同:shape属性将为你提供DataFrame的尺寸。这意味着你将了解DataFrame的宽度和高度。另一方面, len()函数与index属性结合使用, 只会为你提供有关DataFrame高度的信息。

但是, 正如你显式指定index属性那样, 所有这些都不是完全不寻常的。

你也可以使用df [0] .count()来了解有关DataFrame高度的更多信息, 但这将排除NaN值(如果有)。这就是为什么在你的DataFrame上调用.count()并不总是更好的选择的原因。

如果需要有关DataFrame列的更多信息, 则始终可以执行list(my_dataframe.columns.values)。在上面的srcmini Light块中自己尝试一下!

基本DataFrame操作

现在, 你已经将数据放入了更方便的Pandas DataFrame结构中, 现在该开始实际工作了!

第一部分将指导你完成在Python中使用DataFrames的第一步。它将介绍你可以在新创建的DataFrame上执行的基本操作:添加, 选择, 删除, 重命名, …命名!

2.如何从Pandas DataFrame中选择索引或列

在开始添加, 删除和重命名DataFrame的组件之前, 你首先需要知道如何选择这些元素。那么, 你如何做到这一点?

即使你可能还记得上一节中的操作方法:从DataFrame中选择索引, 列或值也不是那么困难, 相反。它类似于你在数据分析中使用的其他语言(或软件包!)中看到的内容。如果你不确定, 请考虑以下事项:

在R中, 你可以使用[, ]表示法来访问数据框的值。

现在, 假设你有一个像这样的DataFrame:


   A  B  C
0  1  2  3
1  4  5  6
2  7  8  9

你想访问” A”列中索引0处的值。

存在多种选择来使你的价值1重新获得:

毫无疑问, 最重要的是.loc []和.iloc []。两者之间的细微差异将在下一部分中讨论。

现在足够从DataFrame中选择值了。如何选择行和列?在这种情况下, 你将使用:

现在, 只需知道你可以通过按标签或它们在索引或列中的位置调用它们来访问这些值即可。如果看不到, 请再次查看命令中的细微差别:一次, 你看到[0] [0], 另一次, 你看到的是[0, ‘A’]以检索值1。

3.如何向Pandas DataFrame添加索引, 行或列

既然你已经了解了如何从DataFrame中选择一个值, 那么该开始实际工作并为其添加索引, 行或列了!

向数据框添加索引

创建DataFrame时, 可以选择将输入添加到” index”参数中, 以确保你拥有所需的索引。如果你未指定此参数, 则默认情况下, DataFrame将具有一个数值索引, 该索引从0开始, 一直持续到DataFrame的最后一行。

但是, 即使自动为你指定了索引, 你仍然可以重新使用其中一列并将其作为索引。你可以通过在DataFrame上调用set_index()轻松地做到这一点。在下面尝试一下!

向数据框添加行

在找到解决方案之前, 首先要掌握loc的概念以及它与其他索引属性(如.iloc []和.ix [])的区别:

  • .loc []用于索引的标签。这意味着, 如果你输入loc [2], 则会查找具有标为2的索引的DataFrame的值。
  • .iloc []处理索引中的位置。这意味着, 如果输入iloc [2], 则会查找索引为” 2″的DataFrame值。
  • .ix []是一个更复杂的情况:当索引基于整数时, 将标签传递给.ix []。 ix [2]意味着你正在DataFrame中寻找索引标记为2的值。这就像.loc []一样!但是, 如果你的索引并非仅基于整数, 则ix将与.iloc []一样使用位置。

这一切似乎非常复杂。让我们用一个小例子来说明所有这些:

请注意, 在这种情况下, 你使用了一个不仅仅基于整数的DataFrame示例, 以使你更容易理解差异。你清楚地看到, 将2传递给.loc []或.iloc [] /。ix []不会返回相同的结果!

你知道.loc []会去查看标签2上的值。返回的结果将是


48    1
49    2
50    3

你还知道.iloc []会去查看索引中的位置。通过2后, 你将获得:


48    7
49    8
50    9

由于索引不仅包含整数, 因此.ix []具有与iloc相同的行为, 并查看索引中的位置。你将获得与.iloc []相同的结果。

既然.iloc [] 、. loc []和.ix []之间的区别已经很明显了, 你就可以尝试向DataFrame添加行了!

提示:由于已阅读内容, 因此你现在还可以理解, 一般建议是使用.loc在DataFrame中插入行。这是因为如果使用df.ix [], 则可能会尝试使用索引值引用数字索引, 并意外覆盖DataFrame的现有行。你最好避免这种情况!

在下面的DataFrame中再次检查差异:

你会明白为什么所有这些都会造成混淆, 对吗?

在你的DataFrame中添加一列

在某些情况下, 你希望使索引成为DataFrame的一部分。你可以通过从DataFrame中获取一列或引用尚未创建的列并将其分配给.index属性来轻松地做到这一点, 如下所示:

换句话说, 你告诉DataFrame它应该以A列作为索引。

但是, 如果要将列追加到DataFrame中, 也可以采用与向DataFrame中添加索引相同的方法:使用.loc []或.iloc []。在这种情况下, 可以借助.loc []将Series添加到现有DataFrame中:

请记住, Series对象非常类似于DataFrame的列。这就解释了为什么可以轻松地将Series添加到现有DataFrame的原因。还要注意, 即使在向DataFrame添加列时, 先前对.loc []的观察仍然有效。

重置数据框的索引

如果你的索引看起来不尽如人意, 则可以选择重置它。你可以使用.reset_index()轻松完成此操作。但是, 你仍然应该当心, 因为你可以传递几个可能成功或无法成功进行重置的参数:

现在尝试在上面的代码块中通过替换替换drop参数, 看看会发生什么!

注意如何使用drop参数指示要摆脱那里的索引。如果要就地使用, 则将带有浮点数的原始索引作为额外的列添加到DataFrame中。

4.如何从熊猫数据框中删除索引, 行或列

既然你已经了解了如何选择和向DataFrame添加索引, 行和列, 那么该考虑另一个用例了:从数据结构中删除这三个用例。

从你的DataFrame中删除索引

如果要从DataFrame中删除索引, 则应重新考虑, 因为DataFrame和Series始终都有索引。

但是, 你可以*做的是例如:

重置你的DataFrame的索引(返回上一节以了解如何完成)或

通过执行del df.index.name删除索引名称(如果有的话),

通过重置索引, 删除已添加到DataFrame的索引列的重复项并再次恢复该无重复列作为索引来删除重复的索引值:

最后, 删除一个索引, 并与之一起一行。本教程将对此进行详细说明。

现在你知道了如何从DataFrame中删除索引, 接下来可以继续删除列和行!

从你的DataFrame中删除列

要摆脱DataFrame中的(选择)列, 可以使用drop()方法:

你可能现在想:嗯, 这不是那么简单。还有一些额外的参数传递给drop()方法!

  • axis参数在表示行时为0, 而在用于删除列时为1。
  • 你可以将Inplace设置为True来删除列, 而不必重新分配DataFrame。

从数据框中删除一行

你可以通过执行df.drop_duplicates()从DataFrame中删除重复的行。你还可以从DataFrame中删除行, 只考虑一列中存在的重复值。

看看这个例子:

如果要执行的删除操作没有唯一性标准, 则可以使用drop()方法, 在此方法中, 你可以使用index属性指定要从DataFrame中删除哪些行的索引:

执行此命令后, 你可能想要再次重置索引。

提示:尝试自行重置结果DataFrame的索引!如果你认为必要, 请不要忘记使用drop参数。

5.如何重命名Pandas DataFrame的索引或列

要为数据框的列或索引值赋予不同的值, 最好使用.rename()方法。

提示:尝试将第一个任务(重命名你的列)中的inplace参数更改为False, 然后查看脚本现在呈现的结果。你会发现现在重命名列时尚未重新分配DataFrame。结果, 第二个任务将原始DataFrame用作输入, 而不是你从第一个rename()操作刚获得的输入。

超越Pandas DataFrame基础

既然你已经完成了有关Pandas DataFrames的第一组问题, 那么现在该超越基础知识, 动手实践了, 因为DataFrames比第一部分中介绍的要多得多。

6.如何格式化Pandas DataFrame中的数据

大多数时候, 你还希望能够对DataFrame中包含的实际值进行一些操作。在以下各节中, 你将介绍几种格式化DataFrame值的方法

替换DataFrame中字符串的所有出现

要替换你DataFrame中的某些字符串, 你可以轻松地使用replace():传递你想要更改的值, 然后传递你想要用来替换它们的值。

像这样:

请注意, 当你遇到奇怪的字符串组合时, 还有一个regex参数可以极大地帮助你:

简而言之, 当你想用其他人替换DataFrame中的值或字符串时, replace()通常是你需要处理的!

从DataFrame单元格的字符串中删除部分

删除字符串中不需要的部分很麻烦。幸运的是, 有一个简单的解决方案可以解决这个问题!

你可以在列结果上使用map()将lambda函数应用于列的每个元素或元素方向。该函数本身采用字符串值并去除左侧的+或-, 也去除右侧的六个aAbBcC中的任何一个。

将一列中的文本拆分为一个DataFrame中的多行

这在格式化方面有些困难。但是, 下一个代码块将引导你完成以下步骤:

简而言之, 你要做的是:

首先, 你检查手头的DataFrame。你会看到最后一行和最后一列中的值太长。看来有两张票, 因为一位客人参加了演唱会加了一张。

你从DataFrame df中获取”票证”列, 并在空格上获取字符串。这将确保最后两个票证将以两个单独的行结尾。接下来, 你使用这四个值(四个票证编号)并将它们放入Series对象中:


      0         1
0  23:44:55       NaN
1  66:77:88       NaN
2  43:68:05  56:34:12

这似乎还不太正确。你那里有NaN值!你必须堆叠系列, 以确保所得系列中没有任何NaN值。

接下来, 你会看到系列已堆叠。


0  0    23:44:55
1  0    66:77:88
2  0    43:68:05
   1    56:34:12

那也不理想。这就是为什么你将级别降低到与DataFrame对齐的原因:


0    23:44:55
1    66:77:88
2    43:68:05
2    56:34:12
dtype: object

这就是你想要的。

将你的Series转换为DataFrame, 以确保你可以将其重新加入到初始DataFrame中。但是, 为避免在DataFrame中出现任何重复, 可以删除原始的Ticket列。

将功能应用于Pandas DataFrame的列或行

你可能想通过对DataFrame应用函数来调整数据。让我们通过创建自己的lambda函数开始回答这个问题:


doubler = lambda x: x*2

提示:如果你想进一步了解Python中的函数, 请考虑阅读此Python函数教程。

请注意, 你还可以选择DataFrame的行, 并将doubler lambda函数应用于该行。请记住, 你可以使用.loc []或.iloc []轻松地从DataFrame中选择一行。

然后, 你将执行以下操作, 具体取决于你是根据索引的位置还是基于其标签来选择索引:


df.loc[0].apply(doubler)

请注意, apply()函数仅沿DataFrame的轴应用doubler函数。这意味着你可以定位索引或列。或者, 换句话说, 是行还是列。

但是, 如果要将其应用于每个元素或逐个元素, 则可以使用map()函数。你可以只用map()替换上面代码块中的apply()函数。不要忘记仍然将doubler函数传递给它, 以确保将值乘以2。

假设你想将此加倍函数不仅应用于DataFrame的A列, 还应用于整个列。在这种情况下, 可以使用applymap()将doubler函数应用于整个DataFrame中的每个单个元素:

请注意, 在这些情况下, 我们一直在使用在运行时创建的lambda函数或匿名函数。但是, 你也可以编写自己的函数。例如:

如果你想了解有关Python中控制流的更多信息, 可以随时在此处阅读。

7.如何创建一个空的DataFrame

你将使用的函数是Pandas Dataframe()函数:它要求你传递要放入的数据, 索引和列。

请记住, 数据框中包含的数据不一定必须是同质的。它可以是不同的数据类型!

你可以通过多种方式使用此函数制作一个空的DataFrame。首先, 你可以使用numpy.nan用NaN初始化数据帧。请注意, numpy.nan的类型为float。

现在, 默认情况下会推断数据帧的数据类型:由于numpy.nan具有float类型, 因此数据帧还将包含float类型的值。但是, 你也可以通过添加属性dtype并填充所需的类型来强制DataFrame为特定类型。就像这个例子:

请注意, 如果你未指定轴标签或索引, 则会根据常识规则从输入数据中构建它们。

8.熊猫在导入数据时是否识别日期?

熊猫可以识别它, 但是你需要一点点帮助:从逗号分隔值(CSV)文件中读取数据时, 请添加参数parse_dates:


import pandas as pd
pd.read_csv('yourFile', parse_dates=True)

# or this option:
pd.read_csv('yourFile', parse_dates=['columnName'])

但是, 总是有奇怪的日期时间格式。

别担心!在这种情况下, 你可以构造自己的解析器来处理此问题。例如, 你可以创建一个lambda函数, 该函数使用DateTime并使用格式字符串对其进行控制。


import pandas as pd
dateparser = lambda x: pd.datetime.strptime(x, '%Y-%m-%d %H:%M:%S')

# Which makes your read command:
pd.read_csv(infile, parse_dates=['columnName'], date_parser=dateparse)

# Or combine two columns into a single DateTime column
pd.read_csv(infile, parse_dates={'datetime': ['date', 'time']}, date_parser=dateparse)

9.何时, 为什么以及如何重塑熊猫DataFrame

重塑你的DataFrame可以对其进行转换, 以使生成的结构使其更适合你的数据分析。换句话说, 重塑与格式化DataFrame中包含的值无关, 而更多地与转换其形状有关。

这回答了何时和为什么。但是, 你将如何重塑DataFrame?

整形的三种方式经常引起用户的疑问:旋转, 堆叠, 拆叠和融合。

透视数据框

你可以使用pivot()函数从原始表中创建一个新的派生表。使用该函数时, 可以传递三个参数:

  1. values:此参数允许你指定要在数据透视表中看到的原始DataFrame的值。
  2. 列:传递给此参数的任何内容都将成为结果表中的列。
  3. index:传递给该参数的任何内容都将成为结果表中的索引。

如果你不特别填写期望在结果表中显示的值, 则将以多列为中心:

请注意, 你的数据不能包含所指定列具有重复值的行。如果不是这种情况, 你将收到一条错误消息。如果你不能确保数据的唯一性, 请改用ivot_table方法:

请注意, 附加参数aggfunc传递给了pivot_table方法。此参数表明你使用了一个聚合函数, 用于合并多个值。在此示例中, 你可以清楚地看到使用了均值函数。

使用stack()和unstack()重塑你的Pandas DataFrame

你已经在问题5的答案中看到了堆叠示例!从本质上讲, 你可能还记得, 当你堆叠一个DataFrame时, 会使其变得更高。你将最里面的列索引移动为最里面的行索引。你将返回一个带有索引的DataFrame, 该索引具有新的最内层的行标签。

如果你不确定stack()的工作原理, 请返回完整的问题5演练。

堆积的逆过程称为堆积。与stack()极为相似, 你可以使用unstack()将最里面的行索引移动为最里面的列索引。

有关枢转, 堆叠和卸垛的详细说明, 请转到此页面。

使用melt()重塑你的DataFrame

如果你的数据中有一个或多个列是标识符变量, 而所有其他列都被视为测量变量, 则认为融解很有用。

这些测量变量全部”未透视”至行轴。也就是说, 虽然所测量的变量分布在DataFrame的整个宽度上, 但熔体将确保将其放置在其高度上。或者, 换句话说, 你的DataFrame现在将变长而不是变宽。

因此, 你有两个非标识符列, 即”变量”和”值”。

让我们用一个例子来说明:

如果你正在寻找其他方法来重塑数据, 请查阅文档。

10.如何遍历Pandas DataFrame

你可以在for循环的帮助下结合DataFrame上的iterrows()来遍历DataFrame的行:

iterrows()允许你以(索引, 系列)对的形式有效地循环遍历DataFrame行。换句话说, 它给你(索引, 行)元组。

11.如何将Pandas DataFrame写入文件

使用Pandas完成数据整理和操作后, 你可能希望将DataFrame导出为另一种格式。本节将介绍两种输出DataFrame的方法:CSV或Excel文件。

将数据帧输出到CSV

要将DataFrame编写为CSV文件, 可以使用to_csv():


import pandas as pd
df.to_csv('myDataFrame.csv')

这段代码看起来很简单, 但这正是大多数人开始遇到困难的地方, 因为你将对数据输出有特定的要求。也许你不希望使用逗号作为定界符, 或者想要指定特定的编码, …

不用担心你可以将一些其他参数传递给to_csv(), 以确保按照你希望的方式输出数据!

要用制表符分隔, 请使用sep参数:


import pandas as pd
df.to_csv('myDataFrame.csv', sep='\t')

要使用特定的字符编码, 可以使用encoding参数:


import pandas as pd
df.to_csv('myDataFrame.csv', sep='\t', encoding='utf-8')

此外, 你可以指定表示NaN或缺失值的方式, 是否要输出标题, 是否要写出行名, 是否要压缩, 等等。阅读选项这里。

将DataFrame写入Excel

与将DataFrame输出为CSV所做的操作类似, 你可以使用to_excel()将表写入Excel。但是, 它有点复杂:


import pandas as pd
writer = pd.ExcelWriter('myDataFrame.xlsx')
df.to_excel(writer, 'DataFrame')
writer.save()

但是请注意, 就像to_csv()一样, 你还有很多额外的参数, 例如startcol, startrow等, 以确保正确输出数据。转到此页面阅读它们。

但是, 如果你想了解有关Pandas中IO工具的更多信息, 请查看此页面。

适用于数据科学的Python不仅仅是DataFrames

而已!你已成功完成Pandas DataFrame教程!

回答11个常见熊猫问题的答案代表必不可少的功能, 这些功能是你导入, 清理和处理数据以进行数据科学工作所需的。你不确定你对此事是否足够深入?我们的”在Python中导入数据”课程将为你提供帮助!如果你对此有所了解, 则可能希望在现实生活中看到熊猫在工作。数据科学中的预处理的重要性和机器学习流水线教程系列是必读的, 而公开课” Python和机器学习入门”则是必修课。

赞(0)
未经允许不得转载:srcmini » Pandas教程:Python中的DataFrame

评论 抢沙发

评论前必须登录!