数据分析工具Pandas:快速掌握Pandas应用

Pandas是基于Python语言的数据分析工具,它在Numpy基础上构建,Pandas封装了大量标准的数据模型,并提供了操作大数据所需的工具,降低了编写数据分析程序所需的工作量,提高了开发数据分析程序的效率和质量。

安装Pandas


进入操作系统的命令行窗口,在命令行窗口输入并执行下面的命令:
pip3 install pandas
即可安装Pandas数据分析工具。

Pandas数据结构

Pandas用于操作数据的结构主要是Series和Dataframe,下面分别介绍这两种数据结构。

Series


Series是一维数组,它在一维数组索引的基础上又添加了数据标签,数组数据即可以通过索引访问,也可以通过数据标签访问(类似于字典对象的key和value)。数组的数据类型可以是整数、浮点数、字符串、列表、布尔值、自定义Python类等数据。
可以使用多种方式创建Series数据对象,Series的构造方法支持列表、Numpy数组、字典等数据类型的传入。
例1 创建Series数据对象

# 导入pandas库
import pandas as pd
# 导入Numpy库
import numpy as np

# 通过列表数据创建
# index: 定义数据标签,数据标签与元素个数相同,参数可选
# dtype: 定义数据类型,参数可选
s_data = pd.Series([5.1,3.5,1.4,0.2],index=["Sepal.Length","Sepal.Width","Petal.Length","Petal.Width"],dtype=float)
# 索引访问
print(s_data[0])
# 数据标签访问
print(s_data["Sepal.Length"])

# 通过Numpy数组创建
s_data = pd.Series(np.array([5.1,3.5,1.4,0.2]))
print(s_data)

# 通过字典对象创建
s_data = pd.Series({"Sepal.Length":5.1,"Sepal.Width":3.5,"Petal.Length":1.4,"Petal.Width":0.2})
# 索引访问
print(s_data[0])
# 数据标签访问
print(s_data["Sepal.Length"])

Series数据对象的切片语法Numpy数组的切片语法相同,对Series数据对象的切片可参见Numpy数组。

DataFrame

DataFrame是一个二维表结构,它包含一组有序的列,每列元素的数据类型可以是整数、浮点数、布尔值、字符串、列表、自定义Python类等数据。它即可以按行来访问(行索引),也可以按列来访问(列索引),访问单个元素时,需要同时使用行索引和列索引。
可以使用多种方式创建DataFrame数据对象,DataFrame的构造方法支持列表、Numpy数组、字典等数据类型的传入。
例2 创建DataFrame数据对象

# 导入pandas库
import pandas as pd
# 导入Numpy库
import numpy as np

# 通过列表数据创建
# columns: 列数据标签
# index: 行数据标签
s_data = pd.DataFrame([[5.1,3.5,1.4,0.2],
[6.1,3.7,4.1,1.5],
[5.8,2.7,5.1,1.9]],
columns=['feature_one','feature_two','feature_three','feature_four'],
index=['one','two','three'])
# 输出s_data
print(s_data)

# 访问第1列
print("访问第1列")
print(s_data["feature_one"])

# 访问第1行
print("访问第1行")
print(s_data.loc["one"])

# 访问第1行第2列元素
print(s_data.loc["one"]["feature_two"])

输出结果如下:

DataFrame数据对象的切片语法Numpy数组的切片语法相同,对DataFrame数据对象的切片可参见Numpy数组。

重新索引


重新索引是Pandas非常重要的功能,它可以对数据重新建立索引,并且在建立索引的过程中,对缺失值进行填充。
Series和DataFrame数据对象的reindex方法可以对数据重新索引,数据分析程序拿到的数据可能会有很多缺失值,需要对这些数据重新建立索引,并且填充缺失值。
例3 对数据重新索引

# 导入pandas库
import pandas as pd
# 导入Numpy库
import numpy as np

# 通过列表数据创建
s_data = pd.DataFrame([[5.1,3.5,1.4,0.2],
[6.1,3.7,4.1,1.5],
[5.8,2.7,5.1,1.9]],
columns=['feature_one','feature_two','feature_three','feature_for'],
index=['one','two','three']
)
# 输出s_data
print(s_data)

# 重新建立索引
# 列索引增加1列,行索引增加1行
# fill_value:填充缺失值
s_data = s_data.reindex(columns=['feature_one','feature_two','feature_three','feature_for','feature_five'],
index=['one','two','three','four'],
fill_value=1.0
)
print(s_data)

输出结果如下:

算术运算

Pandas可以对数据对象内整体数据或不同索引的数据进行算术运算,多个数据对象也可以进行算术运算。
例4 单个数据对象的算术运算

# 导入pandas库
import pandas as pd

# 创建数据对象
s_data = pd.DataFrame([[5.1,3.5,1.4,0.2],
[6.1,3.7,4.1,1.5],
[5.8,2.7,5.1,1.9]],
columns=['feature_one','feature_two','feature_three','feature_for'],
index=['one','two','three']
)
# 输出数据
print(s_data)

# 整体数据算术运算
# 运算结果并没有赋值给s_data
print(s_data*2)

# 按列索引进行算术运算
print(s_data['feature_one']**2)

# 按行索引进行算术运算
print(s_data.loc['two']**2)

输出结果如下:

例5 多个数据对象的算术运算

# 导入pandas库
import pandas as pd

# 创建数据对象
s_data1 = pd.DataFrame([[5.1,3.5,1.4,0.2],
[6.1,3.7,4.1,1.5],
[5.8,2.7,5.1,1.9]],
columns=['feature_one','feature_two','feature_three','feature_for'],
index=['one','two','three']
)

s_data2 = pd.DataFrame([[5.1,3.5,1.4,0.2],
[6.1,3.7,4.1,1.5],
[5.8,2.7,5.1,1.9]],
columns=['feature_one','feature_two','feature_three','feature_for'],
index=['one','two','three']
)

s_data3 = pd.DataFrame([[5.1,3.5,1.4],
[6.1,3.7,4.1],
[5.8,2.7,5.1]],
columns=['feature_one','feature_two','feature_three'],
index=['one','two','three']
)

# 两个行列索引相同的数据对象相加
print(s_data1+s_data2)

# 两个行列索引不相同的数据对象相加
# 可以调用数据对象的add方法,传入缺失值的默认值
print(s_data1.add(s_data3,fill_value=0))

输出结果如下:

数据对象提供的算术方法如下表所示:

序号 方法 说明
1 add 两个数据对象相加
2 sub 两个数据对象相减
3 div 两个数据对象相除
4 mul 两个数据对象相乘

使用函数处理数据

pandas 的 apply() 函数可以作用于Series 或者整个 DataFrame数据对象,它会自动遍历Series或者DataFrame所有元素, 并对每一个元素调用函数进行处理。

案例1:假设我们有一个 Series 对象,其中包含了数字,我们想要计算每个数字的平方。

import pandas as pd

# 创建一个Series对象
data = pd.Series([1, 2, 3, 4, 5])

# 定义一个函数来计算平方
def square(x):
return x ** 2

# 使用apply()函数
squared_data = data.apply(square)

print(squared_data)

pd.Series([1, 2, 3, 4, 5]) 创建了一个包含数字 1 到 5 的 Series 对象。
def square(x): return x ** 2 定义了一个函数 square,它接受一个参数 x 并返回 x 的平方。
data.apply(square) 将 square 函数应用于 data 中的每个元素,并返回一个新的 Series 对象 squared_data,其中包含了原始数据的平方。
案例2:假设我们有一个 DataFrame,其中包含了学生的姓名和分数,我们想要计算每个学生的分数是否及格(假设及格分数为60)。

import pandas as pd

# 创建一个DataFrame对象
data = pd.DataFrame({
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Score': [55, 70, 85, 60]
})

# 定义一个函数来判断是否及格
def is_passing(row):
return row['Score'] >= 60

# 使用apply()函数,axis=1表示逐行操作
passing_data = data.apply(is_passing, axis=1)

print(passing_data)

pd.DataFrame(...) 创建了一个包含学生姓名和分数的 DataFrame 对象。
def is_passing(row): return row['Score'] >= 60 定义了一个函数 is_passing,它接受一个 row 参数(表示 DataFrame 的一行)并返回一个布尔值,表示该学生的分数是否及格。
data.apply(is_passing, axis=1) 将 is_passing 函数应用于 data 中的每一行(axis=1 表示按行操作),并返回一个新的 Series 对象 passing_data,其中包含了每个学生是否及格的信息。
案例3: 假设我们有一个 DataFrame,其中包含了学生的数学和英语成绩,我们想要计算每门课程的平均分。

import pandas as pd

# 创建一个DataFrame对象
data = pd.DataFrame({
'Math': [85, 90, 78, 92],
'English': [88, 76, 90, 84]
})

# 使用apply()函数,axis=0表示逐列操作,并传入mean作为函数
average_scores = data.apply(pd.Series.mean, axis=0)

print(average_scores)

pd.DataFrame(...) 创建了一个包含学生数学和英语成绩的 DataFrame 对象。
data.apply(pd.Series.mean, axis=0) 将 pd.Series.mean 方法应用于 data 中的每一列(axis=0 表示按列操作),并返回一个新的 Series 对象 average_scores,其中包含了每门课程的平均分