写在前面
在掌握了NumPy这一强大的数值计算工具后,我们将迈入数据科学的下一个核心领域:表格数据的处理与分析。如果说NumPy是处理同质化数值数组的利器,那么Pandas就是为处理和分析带有标签的、异质性的表格数据而生的瑞士军刀。它构建于NumPy之上,提供了更高级的数据结构和操作,让数据清洗、转换、分析和可视化变得异常简单。本文将从零开始,带你系统学习Pandas的基础知识,为你的数据分析之旅打下坚实的基石。
创建一个形状为 (3, 4) 的二维数组,数组元素为从0到11的整数,并打印其形状、维度和数据类型。
import numpy as np
# 创建数组
arr = np.arange(12).reshape(3, 4)
print("创建的数组:")
print(arr)
print("\n数组形状:", arr.shape)
print("数组维度:", arr.ndim)
print("数据类型:", arr.dtype)
输出结果:
创建的数组:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
数组形状: (3, 4)
数组维度: 2
数据类型: int64
对上述数组进行转置,并计算所有元素的和、每列的平均值。
# 数组转置
arr_transposed = arr.T
print("转置后的数组:")
print(arr_transposed)
# 计算总和与列平均值
total_sum = arr.sum()
column_means = arr.mean(axis=0) # axis=0 表示沿列方向计算(即每列)
print("\n数组所有元素之和:", total_sum)
print("每列的平均值:", column_means)
输出结果:
转置后的数组:
[[ 0 4 8]
[ 1 5 9]
[ 2 6 10]
[ 3 7 11]]
数组所有元素之和: 66
每列的平均值: [4. 5. 6. 7.]
创建一个包含10个随机整数(范围1-100)的一维数组,找出其中的最大值、最小值以及大于50的元素。
# 设置随机种子使结果可复现
np.random.seed(42)
random_arr = np.random.randint(1, 101, size=10)
print("随机整数数组:", random_arr)
max_val = random_arr.max()
min_val = random_arr.min()
greater_than_50 = random_arr[random_arr > 50]
print("最大值:", max_val)
print("最小值:", min_val)
print("大于50的元素:", greater_than_50)
输出结果:
随机整数数组: [52 93 15 72 61 21 83 87 75 75]
最大值: 93
最小值: 15
大于50的元素: [52 93 72 61 83 87 75 75]
Pandas 是一个开源的、BSD许可的Python库,为Python编程语言提供了高性能、易于使用的数据结构和数据分析工具。它的名字来源于“Panel Data”(面板数据)和“Python Data Analysis”(Python数据分析)。Pandas的核心价值在于能够轻松处理带有行标签和列名的表格数据(如CSV、Excel文件),进行数据清洗、重塑、切片、聚合以及可视化等操作。它完美地补充了NumPy的功能,是进行数据分析和数据科学项目不可或缺的工具。
数据分析的第一步往往是获取数据。Pandas提供了极其简单的函数来读取各种格式的数据文件。
import pandas as pd # 惯例是将pandas导入为pd
# 读取CSV文件,假设文件名为‘data.csv’
# df = pd.read_csv('data.csv')
# 由于我们可能没有实际文件,这里演示从字符串读取(模拟CSV内容)
csv_data = """姓名,年龄,城市,分数
张三,25,北京,88
李四,30,上海,92
王五,28,广州,85
"""
from io import StringIO
df_from_csv = pd.read_csv(StringIO(csv_data))
print("从CSV字符串读取的DataFrame:")
print(df_from_csv)
输出结果:
从CSV字符串读取的DataFrame:
姓名 年龄 城市 分数
0 张三 25 北京 88
1 李四 30 上海 92
2 王五 28 广州 85
提示:
pd.read_excel()函数可以用于读取Excel文件。数据被读取后,Pandas会将其存储在它最核心的数据结构——DataFrame中。
Pandas主要围绕两种数据结构展开:
创建Series对象
Series可以从列表、字典、NumPy数组等创建。
# 从列表创建,默认索引为0, 1, 2...
s1 = pd.Series([10, 20, 30, 40])
print("从列表创建:")
print(s1)
# 从字典创建,字典的键会成为索引
s2 = pd.Series({'a': 100, 'b': 200, 'c': 300})
print("\n从字典创建:")
print(s2)
# 从NumPy数组创建,并指定自定义索引
import numpy as np
arr = np.array([1.1, 2.2, 3.3])
s3 = pd.Series(arr, index=['x', 'y', 'z'])
print("\n从NumPy数组创建(自定义索引):")
print(s3)
输出结果:
从列表创建:
0 10
1 20
2 30
3 40
dtype: int64
从字典创建:
a 100
b 200
c 300
dtype: int64
从NumPy数组创建(自定义索引):
x 1.1
y 2.2
z 3.3
dtype: float64
Series的常用属性和方法
s = pd.Series([5, 10, 15, 20, 25], index=['a', 'b', 'c', 'd', 'e'])
# 常用属性
print("Series对象s:")
print(s)
print("\n索引:", s.index)
print("值(NumPy数组):", s.values)
print("数据类型:", s.dtype)
print("形状:", s.shape)
# 常用方法
print("\n前3个元素:")
print(s.head(3)) # 默认head()显示前5个
print("\n后2个元素:")
print(s.tail(2))
print("\n描述性统计:")
print(s.describe())
# 索引选取数据
print("\n通过标签索引选取‘c’的值:", s['c'])
print("通过位置索引选取第2个值(从0开始):", s.iloc[1]) # iloc基于整数位置
输出结果:
Series对象s:
a 5
b 10
c 15
d 20
e 25
dtype: int64
索引: Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
值(NumPy数组): [ 5 10 15 20 25]
数据类型: int64
形状: (5,)
前3个元素:
a 5
b 10
c 15
dtype: int64
后2个元素:
d 20
e 25
dtype: int64
描述性统计:
count 5.000000
mean 15.000000
std 7.905694
min 5.000000
25% 10.000000
50% 15.000000
75% 20.000000
max 25.000000
dtype: float64
通过标签索引选取‘c’的值: 15
通过位置索引选取第2个值(从0开始): 10
创建DataFrame对象
DataFrame的创建方式更加灵活。
# 1. 从字典创建(最常用):键是列名,值是列数据(列表或Series)
data_dict = {
'姓名': ['张三', '李四', '王五'],
'年龄': [25, 30, 28],
'城市': ['北京', '上海', '广州']
}
df1 = pd.DataFrame(data_dict)
print("从字典创建:")
print(df1)
# 2. 从列表的列表创建,需指定columns参数
data_list = [['苹果', 5.5], ['香蕉', 3.2], ['橙子', 4.8]]
df2 = pd.DataFrame(data_list, columns=['商品', '价格'])
print("\n从列表的列表创建:")
print(df2)
# 3. 从NumPy二维数组创建
np_array = np.random.randn(3, 2) # 3行2列的标准正态分布随机数
df3 = pd.DataFrame(np_array, columns=['A列', 'B列'])
print("\n从NumPy数组创建:")
print(df3)
输出结果:
从字典创建:
姓名 年龄 城市
0 张三 25 北京
1 李四 30 上海
2 王五 28 广州
从列表的列表创建:
商品 价格
0 苹果 5.5
1 香蕉 3.2
2 橙子 4.8
从NumPy数组创建:
A列 B列
0 -0.234153 1.579213
1 0.767435 -0.469474
2 0.542560 -0.463418
DataFrame的常用属性和方法
# 使用之前从CSV读取的df_from_csv作为示例
df = df_from_csv.copy() # 复制一份避免影响原数据
print("DataFrame内容:")
print(df)
# 常用属性
print("\n列名:", df.columns)
print("行索引:", df.index)
print("各列数据类型:")
print(df.dtypes)
print("形状(行数,列数):", df.shape)
# 常用方法
print("\n查看前2行:")
print(df.head(2))
print("\n查看后1行:")
print(df.tail(1))
print("\nDataFrame的详细信息(内存、数据类型等):")
print(df.info())
print("\n数值列的描述性统计:")
print(df.describe())
# 数据选取
print("\n选取‘姓名’列(返回Series):")
print(df['姓名'])
print("\n选取‘年龄’和‘分数’两列(返回DataFrame):")
print(df[['年龄', '分数']])
print("\n使用iloc按整数位置选取第0行:")
print(df.iloc[0])
print("\n使用loc按标签选取索引为1的行:")
print(df.loc[1])
输出结果:
DataFrame内容:
姓名 年龄 城市 分数
0 张三 25 北京 88
1 李四 30 上海 92
2 王五 28 广州 85
列名: Index(['姓名', '年龄', '城市', '分数'], dtype='object')
行索引: RangeIndex(start=0, stop=3, step=1)
各列数据类型:
姓名 object
年龄 int64
城市 object
分数 int64
dtype: object
形状(行数,列数): (3, 4)
查看前2行:
姓名 年龄 城市 分数
0 张三 25 北京 88
1 李四 30 上海 92
查看后1行:
姓名 年龄 城市 分数
2 王五 28 广州 85
DataFrame的详细信息(内存、数据类型等):
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 姓名 3 non-null object
1 年龄 3 non-null int64
2 城市 3 non-null object
3 分数 3 non-null int64
dtypes: int64(2), object(2)
memory usage: 224.0+ bytes
None
数值列的描述性统计:
年龄 分数
count 3.000000 3.000000
mean 27.666667 88.333333
std 2.516611 3.511885
min 25.000000 85.000000
25% 26.500000 86.500000
50% 28.000000 88.000000
75% 29.000000 90.000000
max 30.000000 92.000000
选取‘姓名’列(返回Series):
0 张三
1 李四
2 王五
Name: 姓名, dtype: object
选取‘年龄’和‘分数’两列(返回DataFrame):
年龄 分数
0 25 88
1 30 92
2 28 85
使用iloc按整数位置选取第0行:
姓名 张三
年龄 25
城市 北京
分数 88
Name: 0, dtype: object
使用loc按标签选取索引为1的行:
姓名 李四
年龄 30
城市 上海
分数 92
Name: 1, dtype: object
恭喜你学完了Pandas的基础知识!现在,请通过以下作业来巩固你的学习成果。请确保你的代码只使用本文介绍过的Pandas知识点。
创建Series
创建一个 Series,数据为 [88, 92, 79, 95, 80],索引为 ['语文', '数学', '英语', '物理', '化学'],并将其命名为 my_series。打印这个Series,并输出其 values 和 index 属性。
创建DataFrame
使用一个字典创建一个 DataFrame,字典内容如下:
‘产品’[‘笔记本’, ‘鼠标’, ‘键盘’]‘销量’[120, 200, 150]‘单价’[5500.0, 80.5, 299.0]sales_df。打印这个DataFrame,并使用 .info() 方法查看其信息。数据选取与计算
对上面创建的 sales_df 进行操作:
‘产品’ 和 ‘销量’ 两列,并打印。‘销售额’(销售额 = 销量 × 单价),并将结果作为一个新列添加到 sales_df 中。sales_df。.describe() 方法查看数值列(销量、单价、销售额)的描述性统计。本文系统介绍了Python数据分析库 Pandas 的核心基础。我们从 读取外部数据文件(如CSV)出发,这是数据分析的起点。接着,我们深入学习了Pandas的两大核心数据结构:一维带标签的 Series 和二维表格型 DataFrame。我们掌握了如何从列表、字典、NumPy数组等多种数据源创建它们,并熟悉了查看其 index、columns、values、shape、dtype 等关键属性的方法。通过 head()、tail()、info()、describe() 等方法,我们可以快速了解数据的全貌。最后,我们学会了如何通过列名或 iloc/loc 索引来选取所需的数据子集。
记住这个基础流程:读取数据 → 创建/获取DataFrame/Series → 查看数据概览 → 选取目标数据。熟练掌握这些操作,你就已经成功打开了使用Pandas进行数据处理与分析的大门。
| 数据读取 | pd.read_csv(‘file.csv’) | |
pd.read_excel(‘file.xlsx’) | ||
| Series创建 | pd.Series(data, index=idx) | data 可以是列表、字典等。 |
| DataFrame创建 | pd.DataFrame(data, columns=cols) | data 可以是字典、列表的列表等。 |
| 通用属性 | .index | |
.columns | ||
.values | ||
.dtype.dtypes |
请在微信客户端打开