介绍
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中的缺失值。