赞
踩
目录
在Python的数据科学与人工智能领域,Numpy和Pandas是两个不可或缺的核心库。Numpy提供了高效的数值计算能力,而Pandas则专注于数据清洗、整理与分析。本篇文章将带领您快速掌握这两个库的基本使用,为后续的数据处理与分析工作打下坚实基础。 更多Python在人工智能中的使用方法,欢迎关注《Python人工智能实战》栏目!
Numpy是Python科学计算库中的基石,以其高效的多维数组对象(ndarray)和丰富的数学函数库,为数值计算提供了强大支持。Numpy数组可以通过多种方式创建,例如使用numpy.array()
函数或者直接使用Numpy提供的函数如numpy.zeros()
, numpy.ones()
等。
下面通过代码示例,快速了解Numpy数组操作与高效计算。
- import numpy as np
-
- # 从列表创建一维数组
- arr1 = np.array([1, 2, 3, 4, 5])
- print(arr1)
- # 输出:[1 2 3 4 5]
-
- # 从二维列表创建二维数组
- arr2 = np.array([[1, 2, 3], [4, 5, 6]])
- print(arr2)
- # 输出:
- # [[1 2 3]
- # [4 5 6]]
-
- # 使用numpy.array()创建数组
- arr = np.array([1, 2, 3, 4, 5])
- print(arr)
- # 输出:
- # [1 2 3 4 5]
-
- # 使用numpy.zeros()创建全零数组
- zeros_arr = np.zeros(5)
- print(zeros_arr)
- # 输出:
- # [0. 0. 0. 0. 0.]
- # 使用numpy.ones()创建全一数组
- ones_arr = np.ones((2, 3))
- print(ones_arr)
- # 输出:
- # [[1. 1. 1.]
- # [1. 1. 1.]]
'运行
- # 获取数组形状、维度和元素个数
- print(arr2.shape) # 输出:(2, 3)
- print(arr2.ndim) # 输出:2
- print(arr2.size) # 输出:6
-
- # 索引与切片
- print(arr2[0, 1]) # 输出:2
- print(arr2[:, 1:]) # 输出:
- # [[2 3]
- # [5 6]]
-
- # 数组拼接与拆分
- arr3 = np.concatenate((arr1, arr2), axis=0)
- print(arr3)
- # 输出:
- # [[1 2 3]
- # [4 5 6]
- # [1 2 3 4 5]]
-
- arr4, arr5 = np.split(arr3, [2], axis=0)
- print(arr4, arr5)
- # 输出:
- # [[1 2 3]
- # [4 5 6]]
- # [[1 2 3 4 5]]
- # 元素级运算
- arr6 = arr1 + arr1
- print(arr6)
- # 输出:[2 4 6 8 10]
-
- # 广播机制:数组与标量运算
- arr7 = arr1 * 2
- print(arr7)
- # 输出:[2 4 6 8 10]
-
- # 矩阵乘法
- arr8 = np.dot(arr2, arr2.T)
- print(arr8)
- # 输出:
- # [[14 32]
- # [32 77]]
Pandas是Python数据分析的主力库,以其灵活的数据框(DataFrame)对象和丰富的数据处理函数,极大简化了数据清洗、转换和分析工作。下面我们将通过代码示例,领略Pandas的强大之处。
- import pandas as pd
-
- data = {
- 'Name': ['Alice', 'Bob', 'Charlie'],
- 'Age': [25, 30, 35],
- 'Salary': [50000, 60000, 70000]
- }
- df = pd.DataFrame(data)
- print(df)
- # 输出:
- # Name Age Salary
- # 0 Alice 25 50000
- # 1 Bob 30 60000
- # 2 Charlie 35 70000
'运行
- # 查看数据框基本信息
- print(df.shape) # 输出:(3, 3)
- print(df.columns) # 输出:Index(['Name', 'Age', 'Salary'], dtype='object')
- print(df.dtypes) # 输出:Name object
- # Age int64
- # Salary int64
- # dtype: object
-
- # 索引与切片
- print(df.iloc[1]) # 输出:Name Bob
- # Age 30
- # Salary 60000
- # Name: 1, dtype: object
- print(df.loc[:1, 'Age':'Salary']) # 输出:
- # Age Salary
- # 0 25 50000
- # 1 30 60000
-
- # 数据筛选与排序
- mask = df['Age'] > 30
- print(df[mask]) # 输出:
- # Name Age Salary
- # 1 Bob 30 60000
- # 2 Charlie 35 70000
- df_sorted = df.sort_values(by='Salary', ascending=False)
- print(df_sorted)
- # 输出:
- # Name Age Salary
- # 2 Charlie 35 70000
- # 1 Bob 30 60000
- # 0 Alice 25 50000
- # 缺失值处理,这里先添加一列模拟缺失列
- df['New Column'] = [np.nan, 1, 2]
- print(df.dropna(subset=['New Column'])) # 输出:
- # Name Age Salary New Column
- # 1 Bob 30 60000 1.0
- # 2 Charlie 35 70000 2.0
-
- # 数据类型转换
- df['Age'] = df['Age'].astype('float')
- print(df.dtypes) # 输出:Name object
- # Age float64
- # Salary int64
- # dtype: object
-
- # 数据聚合与统计
- print(df.groupby('Name').agg({'Age': 'mean', 'Salary': 'sum'}))
- # 输出:
- # Age Salary
- # Name
- # Alice 25.000000 50000
- # Bob 30.000000 60000
- # Charlie 35.000000 70000
- import pandas as pd
-
- # 读取CSV文件
- data = pd.read_csv('sales_data.csv')
-
- # 数据清洗:删除含有缺失值的行
- cleaned_data = data.dropna()
-
- # 数据清洗:将某列的数据类型转换为整数
- cleaned_data['quantity'] = cleaned_data['quantity'].astype(int)
-
- # 数据分析:计算销售额的总和
- total_sales = cleaned_data['sales_amount'].sum()
-
- # 数据分析:分组计算平均销售额
- average_sales_per_category = cleaned_data.groupby('category')['sales_amount'].mean()
-
- # 输出结果
- print("Cleaned Data:")
- print(cleaned_data.head()) # 显示清洗后数据的前几行
- print("Total Sales:", total_sales)
- print("Average Sales per Category:\n", average_sales_per_category)
在这个示例中,CSV文件包含了四列数据:product_id
(产品ID)、category
(产品类别)、quantity
(销售数量)和sales_amount
(销售额)。其中,有些行在quantity
或sales_amount
列中包含了缺失值(NaN
)。
使用上面的Pandas示例代码时,dropna()
函数将删除包含任何缺失值的行,所以ID为5和7的行将被移除。之后,astype(int)
将quantity
列中的数据类型转换为整数,前提是该列中不再包含缺失值或其他非整数类型的数据。
以下为示例数据,保存到本地为sales_data.csv即可使用:
product_id,category,quantity,sales_amount
1,Electronics,5,100.0
2,Books,3,45.5
3,Electronics,2,80.0
4,Clothing,4,120.0
5,Books,NaN,30.0
6,Electronics,7,210.0
7,Clothing,NaN,NaN
8,Books,2,50.0
9,Electronics,3,90.0
10,Clothing,1,60.0
这里我们以鸢尾花(Iris)数据集为例,展示如何使用Pandas进行数据分析。首先,我们需要导入数据集:
- url = "https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv"
- iris_df = pd.read_csv(url)
- print(iris_df.head())
- # 输出:
- # sepal_length sepal_width petal_length petal_width species
- # 0 5.1 3.5 1.4 0.2 setosa
- # 1 4.9 3.0 1.4 0.2 setosa
- # 2 4.7 3.2 1.3 0.2 setosa
- # 3 4.6 3.1 1.5 0.2 setosa
- # 4 5.0 3.6 1.4 0.2 setosa
接下来,我们可以进行一些基本的数据分析:
- print(iris_df.describe())
- # 输出:
- # sepal_length sepal_width petal_length petal_width
- # count 150.000000 150.000000 150.000000 150.000000
- # mean 5.843333 3.057333 3.758000 1.199333
- # std 0.828066 0.435866 1.765298 0.762238
- # min 4.300000 2.000000 1.000000 0.100000
- # 25% 5.100000 2.800000 1.600000 0.300000
- # 50% 5.800000 3.000000 4.350000 1.300000
- # 75% 6.400000 3.300000 5.100000 1.800000
- # max 7.900000 4.000000 6.900000 2.500000
借助于matplotlib库,可以快速绘制一些基础图表,以便对数据进行直观的观察和理解:
- import matplotlib.pyplot as plt
-
- # 绘制箱线图,展示各特征的分布情况
- iris_df.plot(kind='box', figsize=(10, 6))
- plt.title('Iris Dataset Box Plots')
- plt.xlabel('Features')
- plt.ylabel('Values')
- plt.show()
-
- # 绘制散点矩阵,查看特征间的相关性
- sns.pairplot(iris_df, hue='species')
- plt.show()
可视化效果:
在进行机器学习建模之前,我们常常需要对原始数据进行特征工程,包括特征选择、特征转换等操作。例如,可以计算花朵的“面积比”作为新的特征:
- iris_df['sepal_area'] = iris_df['sepal_length'] * iris_df['sepal_width']
- iris_df['petal_area'] = iris_df['petal_length'] * iris_df['petal_width']
这里以KMeans聚类为例,对鸢尾花数据进行分类:
- from sklearn.cluster import KMeans
-
- # 设置聚类数量为3,与鸢尾花的真实类别数量一致
- kmeans = KMeans(n_clusters=3)
-
- # 使用花瓣长度和宽度作为特征进行聚类
- X = iris_df[['petal_length', 'petal_width']]
- kmeans.fit(X)
-
- # 添加聚类结果到数据框
- iris_df['predicted_species'] = kmeans.labels_
至此,已经完成了Numpy的基础用法和代码示例,并结合Pandas对鸢尾花数据集的基本探索性分析、特征工程和初步的机器学习模型训练。这只是一个简单的示例,实际数据分析过程中可能还需要进行更深入的数据清洗、特征选择、模型调优等步骤。通过上述步骤,您应该对使用Pandas进行数据分析有了初步的认识和实践体验。 更多Python在人工智能中的使用方法,欢迎关注《Python人工智能实战》栏目!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。