数据分析工具Pandas:快速掌握Pandas应用
- 人工智能开发
- 1天前
- 14热度
- 0评论
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,其中包含了每门课程的平均分