Python 第三方库:NumPy、Pandas 与 Matplotlib
一、NumPy
(一)数组创建
- 基本数组创建:通过
numpy.array()函数创建数组,可传入列表、元组等可迭代对象。
import numpy as np
arr = np.array([1, 2, 3, 4])
print(arr)
- 特定形状数组创建
np.zeros()创建全零数组,需指定形状参数。如创建一个3行4列的全零数组:
zero_arr = np.zeros((3, 4))
print(zero_arr)
np.ones()创建全一数组,用法类似np.zeros()。
one_arr = np.ones((2, 5))
print(one_arr)
np.empty()创建一个未初始化的数组,其内容是内存中的随机值,同样需指定形状。
empty_arr = np.empty((4, 3))
print(empty_arr)
np.arange()创建一个指定范围的数组,类似于Python内置的range()函数,但返回的是NumPy数组。例如创建从0到9(不包含9),步长为2的数组:
arange_arr = np.arange(0, 9, 2)
print(arange_arr)
np.linspace()创建一个在指定区间内均匀分布的数组,需指定起始值、结束值和元素个数。如创建在0到1之间(包含0和1)均匀分布的5个元素的数组:
linspace_arr = np.linspace(0, 1, 5)
print(linspace_arr)
(二)数组属性
- 形状(shape):通过
shape属性获取数组的维度信息,返回一个元组,每个元素表示对应维度的大小。
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr.shape) # 输出 (2, 3)
- 维度(ndim):
ndim属性返回数组的维度数量。
print(arr.ndim) # 输出 2
- 元素个数(size):
size属性返回数组中元素的总数。
print(arr.size) # 输出 6
- 数据类型(dtype):
dtype属性显示数组中元素的数据类型。
print(arr.dtype) # 通常输出 int64
(三)数组运算
- 算术运算:对数组进行加、减、乘、除等运算时,是对应元素之间的操作。
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
add_result = arr1 + arr2
sub_result = arr1 - arr2
mul_result = arr1 * arr2
div_result = arr1 / arr2
print(add_result) # 输出 [5 7 9]
print(sub_result) # 输出 [-3 -3 -3]
print(mul_result) # 输出 [ 4 10 18]
print(div_result) # 输出 [0.25 0.4 0.5 ]
- 广播(Broadcasting):当对形状不同的数组进行运算时,NumPy会尝试进行广播,使它们能够兼容。例如,一个一维数组和一个标量进行运算:
arr = np.array([1, 2, 3])
scalar = 2
result = arr * scalar
print(result) # 输出 [2 4 6]
- 数学函数:NumPy提供了丰富的数学函数,可直接应用于数组。如计算数组元素的平方根:
arr = np.array([4, 9, 16])
sqrt_result = np.sqrt(arr)
print(sqrt_result) # 输出 [2. 3. 4.]
(四)数组索引与切片
- 一维数组索引:和Python列表类似,通过索引访问数组元素,索引从0开始。
arr = np.array([10, 20, 30, 40])
print(arr[2]) # 输出 30
- 一维数组切片:使用切片语法获取数组的子数组,
arr[start:stop:step],start为起始索引(包含),stop为结束索引(不包含),step为步长。
arr = np.array([1, 2, 3, 4, 5])
sub_arr = arr[1:4:2]
print(sub_arr) # 输出 [2 4]
- 多维数组索引:通过多个索引值访问多维数组的元素,每个索引值对应一个维度。
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr[1, 2]) # 输出 6
- 多维数组切片:对多维数组进行切片时,每个维度都可以指定切片范围。如获取二维数组的某一行或某一列:
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
row = arr[1, :] # 获取第二行
col = arr[:, 2] # 获取第三列
print(row) # 输出 [4 5 6]
print(col) # 输出 [3 6 9]
(五)数组操作
- 数组拼接:
np.concatenate()函数用于拼接数组,可以沿指定轴进行拼接。例如,拼接两个一维数组:
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
concatenated_arr = np.concatenate((arr1, arr2))
print(concatenated_arr) # 输出 [1 2 3 4 5 6]
对于二维数组,可指定axis参数决定沿哪个轴拼接。如沿行方向拼接:
arr3 = np.array([[1, 2], [3, 4]])
arr4 = np.array([[5, 6], [7, 8]])
concatenated_2d_arr = np.concatenate((arr3, arr4), axis = 0)
print(concatenated_2d_arr)
# 输出 [[1 2]
# [3 4]
# [5 6]
# [7 8]]
- 数组分割:
np.split()函数用于将数组分割成多个子数组。如将一维数组平均分成3个子数组:
arr = np.array([1, 2, 3, 4, 5, 6])
sub_arrays = np.split(arr, 3)
for sub in sub_arrays:
print(sub)
# 输出 [1 2]
# [3 4]
# [5 6]
对于二维数组,同样可指定axis参数决定沿哪个轴分割。 3. 数组重塑:np.reshape()函数用于改变数组的形状,需保证重塑前后元素总数不变。例如将一个一维数组重塑为二维数组:
arr = np.array([1, 2, 3, 4, 5, 6])
reshaped_arr = np.reshape(arr, (2, 3))
print(reshaped_arr)
# 输出 [[1 2 3]
# [4 5 6]]
二、Pandas
(一)数据结构
- Series:一种一维带标签的数组,由索引(index)和数据(values)组成。可通过传入列表或字典创建。
import pandas as pd
data = [10, 20, 30, 40]
index = ['a', 'b', 'c', 'd']
series = pd.Series(data, index = index)
print(series)
通过字典创建时,字典的键作为索引,值作为数据:
dict_data = {'a': 10, 'b': 20, 'c': 30}
series_from_dict = pd.Series(dict_data)
print(series_from_dict)
- DataFrame:是一种二维的表格型数据结构,由多个Series组成,每个Series代表一列数据,所有列共享同一索引。可通过传入字典(键为列名,值为列数据)或二维数组创建。
data = {'Name': ['Alice', 'Bob', 'Charlie'], 'Age': [25, 30, 35]}
df = pd.DataFrame(data)
print(df)
(二)数据读取与写入
- 读取CSV文件:
pd.read_csv()函数用于读取CSV(逗号分隔值)文件。
df = pd.read_csv('data.csv')
print(df.head()) # 查看前5行数据
可通过参数指定分隔符、表头、数据类型等。例如指定分隔符为制表符:
df = pd.read_csv('data.tsv', sep='\t')
- 读取Excel文件:
pd.read_excel()函数用于读取Excel文件。
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
- 写入CSV文件:
to_csv()方法用于将DataFrame写入CSV文件。
df.to_csv('new_data.csv', index=False) # index=False表示不写入索引列
- 写入Excel文件:
to_excel()方法用于将DataFrame写入Excel文件。
df.to_excel('new_data.xlsx', sheet_name='NewSheet', index=False)
(三)数据选择与过滤
- 通过索引选择:对于Series,可以通过索引值选择单个元素或切片选择多个元素。
series = pd.Series([10, 20, 30, 40], index=['a', 'b', 'c', 'd'])
print(series['b']) # 输出 20
print(series['a':'c'])
对于DataFrame,可以使用loc和iloc属性进行选择。loc基于索引标签,iloc基于整数位置。
df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Charlie'], 'Age': [25, 30, 35]}, index=['a', 'b', 'c'])
print(df.loc['b']) # 输出对应索引b的行数据
print(df.iloc[1]) # 输出第二行数据
- 条件过滤:通过布尔索引对DataFrame进行条件过滤。例如筛选出年龄大于30的行:
df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Charlie'], 'Age': [25, 30, 35]})
filtered_df = df[df['Age'] > 30]
print(filtered_df)
(四)数据清洗
- 处理缺失值
- 检测缺失值:
isnull()和notnull()方法用于检测数据中的缺失值,返回布尔值DataFrame或Series。
df = pd.DataFrame({'A': [1, None, 3], 'B': [4, 5, None]})
print(df.isnull())
- 删除缺失值:
dropna()方法用于删除包含缺失值的行或列。默认删除包含任何缺失值的行,可通过axis参数指定轴,how参数指定删除方式('any'或'all')。
new_df = df.dropna() # 删除包含任何缺失值的行
print(new_df)
- 填充缺失值:
fillna()方法用于填充缺失值。可以指定填充值或使用特定的填充方法,如向前填充(ffill)或向后填充(bfill)。
df.fillna(0, inplace=True) # 用0填充缺失值,inplace=True表示直接在原DataFrame上修改
print(df)
- 处理重复值:
duplicated()方法用于检测数据中的重复行,返回布尔值Series。drop_duplicates()方法用于删除重复行。
df = pd.DataFrame({'A': [1, 2, 2, 3], 'B': [4, 5, 5, 6]})
print(df.duplicated())
new_df = df.drop_duplicates()
print(new_df)
(五)数据处理与分析
- 数据合并与连接
- 合并(merge):类似于数据库中的表连接操作,
pd.merge()函数可根据指定的键将两个DataFrame合并。例如根据'ID'列合并两个DataFrame:
df1 = pd.DataFrame({'ID': [1, 2, 3], 'Name': ['Alice', 'Bob', 'Charlie']})
df2 = pd.DataFrame({'ID': [2, 3, 4], 'Age': [30, 35, 40]})
merged_df = pd.merge(df1, df2, on='ID')
print(merged_df)
- 连接(concat):
pd.concat()函数用于沿指定轴连接多个DataFrame。例如沿行方向连接两个DataFrame:
df3 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df4 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})
concatenated_df = pd.concat([df3, df4])
print(concatenated_df)
- 分组与聚合:
groupby()方法用于将数据按指定的列进行分组,然后可以对每个组进行聚合操作。例如按'Category'列分组并计算'Value'列的平均值:
df = pd.DataFrame({'Category': ['A', 'A', 'B', 'B'], 'Value': [10, 20, 30, 40]})
grouped = df.groupby('Category')
result = grouped['Value'].mean()
print(result)
(六)数据重塑
- 透视表(pivot_table):
pivot_table()函数用于创建数据透视表,可对数据进行汇总和重塑。例如创建一个按'Category'和'Subcategory'分组,对'Value'求和的数据透视表:
df = pd.DataFrame({'Category': ['A', 'A', 'B', 'B'], 'Subcategory': ['X', 'Y', 'X', 'Y'], 'Value': [10, 20, 30, 40]})
pivot_df = pd.pivot_table(df, values='Value', index=['Category'], columns=['Subcategory'], aggfunc=np.sum)
print(pivot_df)
- 融化(melt):
melt()方法用于将宽格式数据转换为长格式数据,将列变量转换为行变量。
df = pd.DataFrame({'ID': [1, 2], 'Name': ['Alice', 'Bob'], 'Age': [25, 30]})
melted_df = pd.melt(df, id_vars=['ID'], value_vars=['Name', 'Age'])
print(melted_df)
三、Matplotlib
(一)基本绘图
- 折线图(plot):
plt.plot()函数用于绘制折线图,传入x轴和y轴数据。
import matplotlib.pyplot as plt
x = [1, 2, 3, 4]
y = [10, 20, 15, 25]
plt.plot(x, y)
plt.show()
- 散点图(scatter):
plt.scatter()函数用于绘制散点图,同样传入x轴和y轴数据。
x = [1, 2, 3, 4, 5]
y = [5, 4, 6, 2, 7]
plt.scatter(x, y)
plt.show()
- 柱状图(bar):
plt.bar()函数用于绘制柱状图,传入x轴位置和柱子高度数据。
x = ['A', 'B', 'C', 'D']
y = [10, 20, 15, 25]
plt.bar(x, y)
plt.show()
(二)图形定制
- 设置标题和标签:
plt.title()设置图形标题,plt.xlabel()和plt.ylabel()分别设置x轴和y轴标签。
x = [1, 2, 3, 4]
y = [10, 20, 15, 25]
plt.plot(x, y)
plt.title('示例折线图')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.show()
- 设置颜色和样式:可以通过参数设置线条颜色、标记样式等。例如设置折线颜色为红色,标记为圆形:
x = [1, 2, 3, 4]
y = [10, 20, 15, 25]
plt.plot(x, y, color='red', marker='o')
plt.show()
- 设置坐标轴范围:
plt.xlim()和plt.ylim()分别用于设置x轴和y轴的范围。
x = [1, 2, 3, 4]
y = [10, 20, 15, 25]
plt.plot(x, y)
plt.xlim(0, 5)
plt.ylim(5, 30)
plt.show()
- 添加图例:使用
plt.legend()添加图例,在绘图时通过label参数为不同的线条或图形元素命名。
x = [1, 2, 3, 4]
y1 = [10, 20, 15, 25]
y2 = [12, 18, 16, 22]
plt.plot(x, y1, label='数据1')
plt.plot(x, y2, label='数据2')
plt.legend()
plt.show()
(三)子图绘制
- 使用
plt.subplot():plt.subplot()函数用于在一个图形中创建多个子图,语法为plt.subplot(nrows, ncols, index),其中nrows和ncols指定子图的行数和列数,index指定当前子图的编号(从1开始)。
plt.subplot(2, 2, 1)
x1 = [1, 2, 3, 4]
y1 = [10, 20, 15, 25]
plt.plot(x1, y1)
plt.title('子图1')
plt.subplot(2, 2, 2)
x2 = [1, 2, 3, 4]
y2 = [5, 15, 10, 20]
plt.plot(x2, y2)
plt.title('子图2')
plt.subplot(2, 2, 3)
x3 = [1, 2, 3, 4]
y3 = [8, 16, 12, 24]
plt.scatter(x3, y3)
plt.title('子图3')
plt.subplot(2, 2, 4)
x4 = ['A', 'B', 'C', 'D']
y4 = [10, 20, 15, 25]
plt.bar(x4, y4)
plt.title('子图4')
plt.tight_layout() # 自动调整子图参数,避免重叠
plt.show()
- 使用
plt.subplots():plt.subplots()函数更方便地创建多个子图,它返回一个包含图形对象和子图对象数组的元组。
fig, axs = plt.subplots(2, 2)
x1 = [1, 2, 3, 4]
y1 = [10, 20, 15, 25]
axs[0, 0].plot(x1, y1)
axs[0, 0].set_title('子图1')
x2 = [1, 2, 3, 4]
y2 = [5, 15, 10, 20]
axs[0, 1].plot(x2, y2)
axs[0, 1].set_title('子图2')
x3 = [1, 2, 3, 4]
y3 = [8, 16, 12, 24]
axs[1, 0].scatter(x3, y3)
axs[1, 0].set_title('子图3')
x4 = ['A', 'B', 'C', 'D']
y4 = [10, 20, 15, 25]
axs[1, 1].bar(x4, y4)
axs[1, 1].set_title('子图4')
fig.tight_layout()
plt.show()
(四)保存图形
使用plt.savefig()函数将绘制的图形保存为文件,可以指定文件格式,如png、jpg、pdf等。
x = [1, 2, 3, 4]
y = [10, 20, 15, 25]
plt.plot(x, y)
plt.title('示例图形')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.savefig('example_plot.png')
Matplotlib还有许多其他功能,如3D绘图(通过mpl_toolkits.mplot3d工具包)、图像显示(plt.imshow())等,可根据具体需求进一步学习和探索。