Python 3中的pandas包及其数据结构简介

Python pandas包用于数据操作和分析,旨在使标记或关系数据的工作更直观。在本教程中,我们首先安装`pandas`,然后使用基本数据结构:Series和DataFrames。

介绍

Python pandas包用于数据操作和分析,旨在让您以更直观的方式使用带标签或关系数据。 建立在numpy包上,pandas包括标签,描述性索引,并且在处理常见的数据格式和缺少的数据方面特别强大。 pandas包提供了电子表格功能,但使用Python比使用电子表格更快地处理数据,并且pandas被证明是非常有效的。 在本教程中,我们将首先安装pandas,然后使用基本数据结构: SeriesDataFrames

安装pandas

像其他Python包一样,我们可以用pip安装pip 。 首先,让我们进入我们的本地编程环境基于服务器的编程环境 ,并安装pandas及其依赖关系:
pip install pandas numpy python-dateutil pytz
您应该收到类似以下的输出:
Successfully installed pandas-0.19.2
如果您喜欢在Anaconda中安装pandas ,可以使用以下命令:
conda install pandas
在这一点上,您已经准备好开始使用pandas包。

系列

在pandas中, Series是可以保存任何数据类型的一维数组。 轴标签统称为索引 。 让我们在命令行中启动Python解释器,如下所示:
python
从解释器中,将numpy和pandas包导入到您的命名空间中:
import numpy as np
import pandas as pd
在使用Series之前,让我们来看看它的外观:
s = pd.Series([data], index=[index])
您可能会注意到,数据的结构类似于Python 列表

没有声明索引

我们将输入整数数据,然后为Series提供一个名称参数,但我们将避免使用index参数来看看pandas是如何隐式填充的:
s = pd.Series([0, 1, 4, 9, 16, 25], name='Squares')
现在,让我们调用系列,所以我们可以看到什么pandas与它:
s
我们将看到以下输出,索引在左侧列中,我们的数据值在右侧列中。列下面是有关“系列名称”和构成值的数据类型的信息。
0     0
1     1
2     4
3     9
4    16
5    25
Name: Squares, dtype: int64
虽然我们没有为数组提供索引,但是隐式添加了整数值05

声明索引

正如上面的语法显示了我们,我们还可以使用显式索引来创建Series。我们将使用有关地球海洋的平均深度(米)的数据:
avg_ocean_depth = pd.Series([1205, 3646, 3741, 4080, 3270], index=['Arctic',  'Atlantic', 'Indian', 'Pacific', 'Southern'])
在构建系列时,让我们调用它来查看输出:
avg_ocean_depth
Arctic      1205
Atlantic    3646
Indian      3741
Pacific     4080
Southern    3270
dtype: int64
我们可以看到,我们提供的索引在左边,右边的值。

分度和切片系列

使用pandas系列,我们可以通过相应的数字索引检索值:
avg_ocean_depth[2]
3741
我们也可以通过索引号来检索值:
avg_ocean_depth[2:4]
Indian     3741
Pacific    4080
dtype: int64
另外,我们可以调用索引的值来返回它对应的值:
avg_ocean_depth['Indian']
3741
我们还可以使用索引的值切片以返回相应的值:
avg_ocean_depth['Indian':'Southern']
Indian      3741
Pacific     4080
Southern    3270
dtype: int64
请注意,在最后一个示例中,当使用索引名称进行切片时,这两个参数是包含的,而不是排除的。 让我们退出Python解释器与quit()

系列用词典初始化

使用pandas我们也可以使用字典数据类型来初始化一个系列。这样,我们不会将索引声明为单独的列表,而是使用内置键作为索引。 让我们创建一个名为ocean.py的文件,并添加以下字典并打印它。
ocean.py
import numpy as np
import pandas as pd

avg_ocean_depth = pd.Series({
                    'Arctic': 1205,
                    'Atlantic': 3646,
                    'Indian': 3741,
                    'Pacific': 4080,
                    'Southern': 3270
})

print(avg_ocean_depth)

现在我们可以在命令行上运行该文件:
python ocean.py
我们将收到以下输出:
Arctic      1205
Atlantic    3646
Indian      3741
Pacific     4080
Southern    3270
dtype: int64
系列以有组织的方式显示,索引(由我们的键组成)在左边,值的集合在右边。 这将像其他Python字典一样工作,您可以通过调用键访问值,我们可以这样做:
ocean_depth.py
...
print(avg_ocean_depth['Indian'])
print(avg_ocean_depth['Atlantic':'Indian'])
3741
Atlantic    3646
Indian      3741
dtype: int64
但是,这些系列现在是Python对象,因此您将无法使用字典函数。 Python字典提供了另一种形式来在pandas中设置Series。

DataFrames

DataFrames是具有可以由不同数据类型组成的列的2维标记数据结构。 DataFrames类似于电子表格或SQL表。一般来说,当你使用pandas时,DataFrames将是你将使用的最常见的对象。 要了解pandas DataFrame的工作原理,让我们设置两个Series,然后将它们传递给DataFrame。第一个系列将是我们之前的avg_ocean_depth系列,我们的第二个系列将是max_ocean_depth ,其中包含地球上每个海洋的最大深度的数据,以米为单位。
ocean.py
import numpy as np
import pandas as pd


avg_ocean_depth = pd.Series({
                    'Arctic': 1205,
                    'Atlantic': 3646,
                    'Indian': 3741,
                    'Pacific': 4080,
                    'Southern': 3270
})

max_ocean_depth = pd.Series({
                    'Arctic': 5567,
                    'Atlantic': 8486,
                    'Indian': 7906,
                    'Pacific': 10803,
                    'Southern': 7075
})
使用这两个系列设置,让我们将DataFrame添加到文件的底部,在max_ocean_depth系列之下。 在我们的示例中,这两个系列都有相同的索引标签,但如果您使用不同标签的系列,那么缺少的值将标记为NaN 。 这是这样构造的,我们可以包括列标签,我们声明为系列变量的键。要看看DataFrame是什么样子,让我们发出一个打印它的调用。
ocean.py
...
max_ocean_depth = pd.Series({
                    'Arctic': 5567,
                    'Atlantic': 8486,
                    'Indian': 7906,
                    'Pacific': 10803,
                    'Southern': 7075
})

ocean_depths = pd.DataFrame({
                    'Avg. Depth (m)': avg_ocean_depth,
                    'Max. Depth (m)': max_ocean_depth
})

print(ocean_depths)

          Avg. Depth (m)  Max. Depth (m)
Arctic              1205            5567
Atlantic            3646            8486
Indian              3741            7906
Pacific             4080           10803
Southern            3270            7075
输出显示两个列标题以及每个列下的数字数据,字典键的标签位于左侧。

在DataFrames中对数据排序

我们可以使用DataFrame.sort_values(by=...)函数对DataFrame的数据进行排序 。 例如,让我们使用ascending Boolean参数,它可以是TrueFalse 。 注意, ascending是我们可以传递给函数的参数,但是降序不是。
ocean_depth.py
...
print(ocean_depths.sort_values('Avg. Depth (m)', ascending=True))
          Avg. Depth (m)  Max. Depth (m)
Arctic              1205            5567
Southern            3270            7075
Atlantic            3646            8486
Indian              3741            7906
Pacific             4080           10803
现在,输出显示最左侧整数列中从低值升高到高值的数字。

使用DataFrames进行统计分析

接下来,让我们看看我们可以使用DataFrame.describe()函数从DataFrame.describe()收集的一些摘要统计信息 。 在不传递特定参数的情况下, DataFrame.describe()函数将为数值数据类型提供以下信息:
返回 这是什么意思
count 频率计数;事情发生的次数
mean 平均值或平均值
std 标准偏差,用于表示数据变化范围的数值
min 集合中的最小或最小数字
25% 第25百分位数
50% 第50百分位数
75% 75百分位数
max 集合中的最大或最大数字
让我们通过用describe()函数调用我们的ocean_depths DataFrame来为我们打印出这些统计数据:
ocean.py
...
print(ocean_depths.describe())
当我们运行这个程序,我们将收到以下输出:
       Avg. Depth (m)  Max. Depth (m)
count        5.000000        5.000000
mean      3188.400000     7967.400000
std       1145.671113     1928.188347
min       1205.000000     5567.000000
25%       3270.000000     7075.000000
50%       3646.000000     7906.000000
75%       3741.000000     8486.000000
max       4080.000000    10803.000000
现在,您可以将此处的输出与原始DataFrame进行比较,并在被视为一个组时更好地了解地球海洋的平均和最大深度。

处理缺失值

通常在使用数据时,您将缺少值。 pandas包提供了处理缺失数据的许多不同方法,缺失数据涉及null数据或由于某种原因而不存在的数据。 在pandas ,这被称为NA数据并且被表示为NaN 。 我们将使用DataFrame.dropna()函数删除丢失的值 ,并使用DataFrame.dropna()函数填充缺失的值 。这将确保你不会遇到问题,因为你开始。 让我们创建一个名为user_data.py的新文件,并用一些缺少值的数据填充它,并将其转换为DataFrame:
user_data.py
import numpy as np
import pandas as pd


user_data = {'first_name': ['Sammy', 'Jesse', np.nan, 'Jamie'],
        'last_name': ['Shark', 'Octopus', np.nan, 'Mantis shrimp'],
        'online': [True, np.nan, False, True],
        'followers': [987, 432, 321, np.nan]}

df = pd.DataFrame(user_data, columns = ['first_name', 'last_name', 'online', 'followers'])

print(df)

我们打印的调用在我们运行程序时向我们显示以下输出:
  first_name      last_name online  followers
0      Sammy          Shark   True      987.0
1      Jesse        Octopus    NaN      432.0
2        NaN            NaN  False      321.0
3      Jamie  Mantis shrimp   True        NaN
这里有相当多的缺失值。 让我们先用dropna()删除缺失的值。
user_data.py
...
df_drop_missing = df.dropna()

print(df_drop_missing)
因为只有一行在我们的小数据集中没有任何值丢失,所以在运行程序时,这是唯一保持不变的行:
  first_name last_name online  followers
0      Sammy     Shark   True      987.0
作为丢弃值的替代方法,我们可以使用我们选择的值填充缺失值,例如0 。 这个我们将用DataFrame.fillna(0)实现。 删除或注释掉我们添加到文件中的最后两行,并添加以下内容:
user_data.py
...
df_fill = df.fillna(0)

print(df_fill)
当我们运行程序时,我们将收到以下输出:
  first_name      last_name online  followers
0      Sammy          Shark   True      987.0
1      Jesse        Octopus      0      432.0
2          0              0  False      321.0
3      Jamie  Mantis shrimp   True        0.0
现在我们的所有列和行都是完整的,而不是有NaN作为我们的值,我们现在有0填充这些空格。你会注意到,在适当的时候使用浮点。 此时,您可以对数据进行排序,进行统计分析,并处理DataFrames中的缺失值。

结论

本教程介绍了使用pandas和Python 3进行数据分析的介绍性信息。您现在应该已安装了pandas,并且可以使用Pandas中的Series和DataFrames数据结构。