Python pandas
包用于数据操作和分析,旨在让您以更直观的方式处理标记或关系数据。
基于numpy
软件包构建,pandas
包括标签,描述性索引,在处理常见数据格式和丢失数据方面特别强大。
pandas
软件包提供了电子表格功能,但使用Python处理数据要比使用电子表格快得多,并且证明pandas
非常有效。
在本教程中,我们将首先安装pandas
,然后让您了解基础数据结构:Series和DataFrames。
pandas
同其它Python包,我们可以使用pip
安装pandas
。
首先,让我们进入我们选择的本地编程环境或基于服务器的编程环境,并在那里安装pandas
和它的依赖项:
pip install pandas numpy python-dateutil pytz
您应该收到类似于以下内容的输出:
Successfully installed pandas-0.19.2
如果您希望pandas
在Anaconda中安装,可以使用以下命令执行此操作:
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提供name参数,但我们将避免使用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
虽然我们没有提供数组的索引,有一个隐含加入的整数值的0
到5
。
正如上面的语法向我们展示的那样,我们也可以使用显式索引创建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
Series,我们可以通过相应的数字索引来检索值:
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
请注意,在最后一个示例中,使用索引名称进行切片时,这两个参数是包容性的而不是独占的。
让我们用quit()
退出Python解释器。
有了pandas
,我们也可以用字典数据类型来初始化一个系列。这样,我们不会将索引声明为单独的列表,而是使用内置键作为索引。
让我们创建一个名为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字典一样,您可以通过调用键来访问值,我们可以这样做:
...
print(avg_ocean_depth['Indian'])
print(avg_ocean_depth['Atlantic':'Indian'])
3741
Atlantic 3646
Indian 3741
dtype: int64
但是,这些系列现在是Python对象,因此您将无法使用字典功能。
Python词典提供了另一种表单来在pandas
中设置Series。
DataFrame是二维标记的数据结构,其具有可由不同数据类型组成的列。
DataFrame类似于电子表格或SQL表。通常,在使用pandas
DataFrame 时,DataFrames将是您将使用的最常用对象。
要了解pandas
DataFrame的工作原理,让我们设置两个Series,然后将它们传递给DataFrame。第一个系列将是我们之前的avg_ocean_depth
系列,第二个max_ocean_depth
系列将包含地球上每个海洋最大深度的数据,以米为单位。
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
系列下方的文件底部。在我们的示例中,这两个系列都具有相同的索引标签,但如果您使用具有不同标签的Series,则会标记缺失值NaN
。
这是以我们可以包含列标签的方式构造的,我们将其声明为Series'变量的键。要查看DataFrame的外观,让我们发出一个打印它的调用。
...
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
输出显示我们的两个列标题以及每个列标题下的数字数据,字典键中的标签位于左侧。
我们可以使用DataFrame.sort_values(by=...)
函数对DataFrame中的数据进行排序。
例如,让我们使用ascending
布尔参数,该参数可以是True
或False
。注意,ascending
是我们可以传递给函数的参数,但descending不是。
...
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
现在,输出显示最左侧整数列中从低值到高值的数字。
接下来,让我们来看看一些总结的统计数据,我们可以用DataFrame.describe()
功能从pandas
收集。
在不传递特定参数的情况下,DataFrame.describe()
函数将为数值数据类型提供以下信息:
返回 | 这是什么意思 |
---|---|
count | 频率计数; 事情发生的次数 |
mean | 平均值或平均值 |
std | 标准偏差,用于表示数据变化范围的数值 |
min | 集合中的最小或最小数字 |
25% | 第25百分位数 |
50% | 第50百分位数 |
75% | 第75百分位数 |
max | 集合中的最大或最大数字 |
让我们通过使用describe()
函数调用我们的ocean_depths
DataFrame 让Python打印出这个统计数据:
...
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.fillna()
函数填补缺失值。这将确保您在开始时不会遇到问题。
让我们创建一个名为user_data.py
的新文件并使用一些缺少值的数据填充它并将其转换为DataFrame:
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()
删除缺失的值。
...
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)
实现。
删除或注释掉我们添加到文件中的最后两行,并添加以下内容:
...
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
填充了这些空格。您会注意到在适当的时候使用浮动。
此时,您可以对数据进行排序,进行统计分析以及处理DataFrame中的缺失值。
本教程介绍了使用pandas
Python 3 进行数据分析的介绍性信息。您现在应该已经安装pandas
,并且可以使用pandas
中的Series和DataFrames数据结构。
想要了解更多关于安装pandas包和使用数据结构的相关教程,请前往腾讯云+社区学习更多知识。
参考文献:《How To Install the pandas Package and Work with Data Structures in Python 3》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。