介绍
Python pandas包用于数据操作和分析,旨在让您以更直观的方式使用带标签或关系数据。
建立在numpy包上,pandas包括标签,描述性索引,并且在处理常见的数据格式和缺少的数据方面特别强大。
pandas包提供了电子表格功能,但使用Python比使用电子表格更快地处理数据,并且pandas被证明是非常有效的。
在本教程中,我们将首先安装pandas,然后使用基本数据结构: Series和DataFrames 。
安装pandas
像其他Python包一样,我们可以用pip安装pip 。
首先,让我们进入我们的本地编程环境或基于服务器的编程环境 ,并安装pandas及其依赖关系:
pip install pandas numpy python-dateutil pytz
您应该收到类似以下的输出:
OutputSuccessfully 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
我们将看到以下输出,索引在左侧列中,我们的数据值在右侧列中。列下面是有关“系列名称”和构成值的数据类型的信息。
Output0 0
1 1
2 4
3 9
4 16
5 25
Name: Squares, dtype: int64
虽然我们没有为数组提供索引,但是隐式添加了整数值0到5 。
声明索引
正如上面的语法显示了我们,我们还可以使用显式索引来创建Series。我们将使用有关地球海洋的平均深度(米)的数据:
avg_ocean_depth = pd.Series([1205, 3646, 3741, 4080, 3270], index=['Arctic', 'Atlantic', 'Indian', 'Pacific', 'Southern'])
在构建系列时,让我们调用它来查看输出:
avg_ocean_depth
OutputArctic 1205
Atlantic 3646
Indian 3741
Pacific 4080
Southern 3270
dtype: int64
我们可以看到,我们提供的索引在左边,右边的值。
分度和切片系列
使用pandas系列,我们可以通过相应的数字索引检索值:
avg_ocean_depth[2]
Output3741
我们也可以通过索引号来检索值:
avg_ocean_depth[2:4]
OutputIndian 3741
Pacific 4080
dtype: int64
另外,我们可以调用索引的值来返回它对应的值:
avg_ocean_depth['Indian']
Output3741
我们还可以使用索引的值切片以返回相应的值:
avg_ocean_depth['Indian':'Southern']
OutputIndian 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
我们将收到以下输出:
OutputArctic 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'])
Output3741
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)
Output 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参数,它可以是True或False 。 注意, ascending是我们可以传递给函数的参数,但是降序不是。
ocean_depth.py
...
print(ocean_depths.sort_values('Avg. Depth (m)', ascending=True))
Output 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())
当我们运行这个程序,我们将收到以下输出:
Output 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)
我们打印的调用在我们运行程序时向我们显示以下输出:
Output 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)
因为只有一行在我们的小数据集中没有任何值丢失,所以在运行程序时,这是唯一保持不变的行:
Output 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)
当我们运行程序时,我们将收到以下输出:
Output 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数据结构。