Python Pandas 基础:数据结构与常用操作详解
Pandas 是 Python 中一个强大且广泛使用的数据分析库,它提供了高性能、易于使用的数据结构和数据分析工具。无论是数据清洗、数据转换、数据聚合还是数据可视化,Pandas 都是数据科学家和分析师的得力助手。本文将详细介绍 Pandas 的两个核心数据结构:Series 和 DataFrame,并探讨它们的常用操作。
1. Pandas 简介
Pandas 的设计目标是让数据处理变得简单、直观。它建立在 NumPy 库之上,因此能够高效地处理大型数据集。Pandas 的主要优势在于其表格型数据结构,它使得处理结构化数据(如 CSV 文件、数据库表或 Excel 表格)变得异常便捷。
在开始之前,请确保你已经安装了 Pandas:
bash
pip install pandas
并在 Python 脚本中导入它:
python
import pandas as pd
import numpy as np # 常用作数据创建辅助
2. Pandas 核心数据结构
Pandas 提供了两种主要的数据结构:Series 和 DataFrame。
2.1 Series (一维数据结构)
Series 是一种一维带标签的数组,可以存储任何数据类型(整数、浮点数、字符串、Python 对象等)。它由两部分组成:数据(values)和索引(index)。
创建 Series:
-
从列表创建:
python
s = pd.Series([1, 3, 5, np.nan, 6, 8])
print(s)
# 输出:
# 0 1.0
# 1 3.0
# 2 5.0
# 3 NaN
# 4 6.0
# 5 8.0
# dtype: float64
如果没有指定索引,Pandas 会自动创建一个从 0 开始的整数索引。 -
指定索引创建:
python
s_indexed = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
print(s_indexed)
# 输出:
# a 10
# b 20
# c 30
# dtype: int64 -
从字典创建:
python
data = {'北京': 100, '上海': 200, '广州': 150}
s_dict = pd.Series(data)
print(s_dict)
# 输出:
# 北京 100
# 上海 200
# 广州 150
# dtype: int64
字典的键会成为 Series 的索引,值成为数据。
Series 的常用属性和操作:
s.index: 获取索引s.values: 获取数据(NumPy 数组)s.dtype: 获取数据类型s.name: 为 Series 命名s[index]: 通过索引访问元素s.head()/s.tail(): 查看前/后几行数据
2.2 DataFrame (二维数据结构)
DataFrame 是 Pandas 最常用的数据结构,它是一个二维的表格型数据结构,可以看作是 Series 对象的字典,或者带行和列标签的 NumPy 数组。它有行索引和列索引。
创建 DataFrame:
-
从字典创建 (字典的值可以是列表、NumPy 数组或 Series):
python
data = {
'城市': ['北京', '上海', '广州', '深圳'],
'人口': [2154, 2428, 1530, 1344],
'面积': [16410, 6340, 7434, 1997]
}
df = pd.DataFrame(data)
print(df)
# 输出:
# 城市 人口 面积
# 0 北京 2154 16410
# 1 上海 2428 6340
# 2 广州 1530 7434
# 3 深圳 1344 1997 -
指定行和列索引:
python
df_indexed = pd.DataFrame(data, index=['a', 'b', 'c', 'd'], columns=['城市', '人口', '面积'])
print(df_indexed)
# 输出:
# 城市 人口 面积
# a 北京 2154 16410
# b 上海 2428 6340
# c 广州 1530 7434
# d 深圳 1344 1997 -
从 CSV 文件读取: (这是最常见的方式之一)
python
# 假设有一个名为 'data.csv' 的文件
# 城市,人口,面积
# 北京,2154,16410
# 上海,2428,6340
# ...
# df_csv = pd.read_csv('data.csv')
# print(df_csv)
DataFrame 的常用属性和操作:
df.index: 获取行索引df.columns: 获取列索引(列名)df.values: 获取数据(NumPy 数组)df.shape: 获取 DataFrame 的维度 (行数, 列数)df.dtypes: 获取每列的数据类型df.info(): 获取 DataFrame 的摘要信息,包括每列的非空值数量和数据类型df.describe(): 生成描述性统计信息,如均值、标准差、最大值、最小值等df.head()/df.tail(): 查看前/后几行数据
3. DataFrame 常用操作
DataFrame 提供了丰富的数据操作功能,以下是一些最常用的:
3.1 选择和索引
-
选择列:
python
print(df['城市']) # 选择单列,返回 Series
print(df[['城市', '人口']]) # 选择多列,返回 DataFrame -
选择行(通过标签
loc和位置iloc):loc(基于标签的索引):
python
df_indexed = pd.DataFrame(data, index=['a', 'b', 'c', 'd'])
print(df_indexed.loc['a']) # 选择单行
print(df_indexed.loc[['a', 'c']]) # 选择多行
print(df_indexed.loc['a':'c', ['城市', '人口']]) # 切片选择行和列iloc(基于整数位置的索引):
python
print(df.iloc[0]) # 选择第一行
print(df.iloc[[0, 2]]) # 选择第一行和第三行
print(df.iloc[0:2, 0:2]) # 切片选择行和列
-
布尔索引 (条件选择):
python
print(df[df['人口'] > 2000]) # 选择人口大于2000的城市
print(df[(df['人口'] > 2000) & (df['面积'] < 10000)]) # 组合条件
3.2 缺失数据处理
Pandas 使用 np.nan (Not a Number) 来表示缺失值。
-
检测缺失值:
python
df_missing = pd.DataFrame({'A': [1, 2, np.nan], 'B': [4, np.nan, 6]})
print(df_missing.isna()) # 返回布尔型 DataFrame
print(df_missing.notna()) -
删除缺失值:
python
print(df_missing.dropna()) # 删除含有任何缺失值的行
print(df_missing.dropna(how='all')) # 删除所有值都为缺失值的行
print(df_missing.dropna(axis=1)) # 删除含有任何缺失值的列 -
填充缺失值:
python
print(df_missing.fillna(0)) # 用 0 填充所有缺失值
print(df_missing.fillna(df_missing['B'].mean())) # 用列的均值填充
print(df_missing.fillna(method='ffill')) # 向前填充 (用前一个有效值填充)
print(df_missing.fillna(method='bfill')) # 向后填充 (用后一个有效值填充)
3.3 数据清洗与转换
-
删除重复行:
python
df_dup = pd.DataFrame({'A': [1, 2, 2], 'B': [3, 4, 4]})
print(df_dup.drop_duplicates())
print(df_dup.drop_duplicates(subset=['A'])) # 基于特定列删除重复项 -
替换值:
python
df_replace = pd.DataFrame({'A': [1, 2, 3], 'B': ['cat', 'dog', 'cat']})
print(df_replace.replace('cat', 'animal'))
print(df_replace.replace({'cat': 'kitty', 'dog': 'puppy'})) # 使用字典批量替换 -
应用函数 (apply):
python
df_apply = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
print(df_apply['A'].apply(lambda x: x * 2)) # 对 Series 应用函数
print(df_apply.apply(np.mean, axis=0)) # 对每一列应用均值 (axis=0)
print(df_apply.apply(np.sum, axis=1)) # 对每一行应用求和 (axis=1)
3.4 分组与聚合 (groupby)
groupby 是 Pandas 中进行数据聚合的强大工具。
“`python
df_group = pd.DataFrame({
‘城市’: [‘北京’, ‘上海’, ‘北京’, ‘上海’],
‘年份’: [2020, 2020, 2021, 2021],
‘销售额’: [100, 150, 120, 180]
})
grouped = df_group.groupby(‘城市’)
print(grouped[‘销售额’].sum()) # 按城市分组,计算销售额总和
输出:
城市
北京 220
上海 330
Name: 销售额, dtype: int64
grouped_multi = df_group.groupby([‘城市’, ‘年份’])
print(grouped_multi[‘销售额’].mean()) # 按多列分组,计算销售额均值
输出:
城市 年份
北京 2020 100.0
2021 120.0
上海 2020 150.0
2021 180.0
Name: 销售额, dtype: float64
“`
agg() 函数可以同时应用多个聚合函数:
“`python
print(grouped[‘销售额’].agg([‘sum’, ‘mean’, ‘count’]))
输出:
sum mean count
城市
北京 220 110.0 2
上海 330 165.0 2
“`
3.5 合并与连接 (merge, concat)
-
concat(拼接): 沿着某个轴将 Pandas 对象(Series 或 DataFrame)连接起来。
“`python
df1 = pd.DataFrame({‘A’: [1, 2], ‘B’: [3, 4]})
df2 = pd.DataFrame({‘A’: [5, 6], ‘B’: [7, 8]})
print(pd.concat([df1, df2])) # 默认按行拼接 (axis=0)
# 输出:
# A B
# 0 1 3
# 1 2 4
# 0 5 7
# 1 6 8df3 = pd.DataFrame({‘C’: [9, 10], ‘D’: [11, 12]})
print(pd.concat([df1, df3], axis=1)) # 按列拼接 (axis=1)输出:
A B C D
0 1 3 9 11
1 2 4 10 12
“`
-
merge(合并): 类似于数据库中的 JOIN 操作,根据一个或多个键将两个 DataFrame 合并。
“`python
left = pd.DataFrame({‘key’: [‘K0’, ‘K1’, ‘K2’, ‘K3’],
‘A’: [‘A0’, ‘A1’, ‘A2’, ‘A3’]})
right = pd.DataFrame({‘key’: [‘K0’, ‘K1’, ‘K4’, ‘K5’],
‘B’: [‘B0’, ‘B1’, ‘B4’, ‘B5’]})print(pd.merge(left, right, on=’key’)) # 默认内连接 (inner join)
输出:
key A B
0 K0 A0 B0
1 K1 A1 B1
print(pd.merge(left, right, on=’key’, how=’outer’)) # 外连接 (outer join)
输出:
key A B
0 K0 A0 B0
1 K1 A1 B1
2 K2 A2 NaN
3 K3 A3 NaN
4 K4 NaN B4
5 K5 NaN B5
“`
3.6 数据输入/输出
Pandas 支持多种文件格式的读写:
-
CSV 文件:
python
# df.to_csv('output.csv', index=False) # 保存 DataFrame 到 CSV 文件,不保存索引
# df_read = pd.read_csv('output.csv') # 从 CSV 文件读取 -
Excel 文件:
python
# df.to_excel('output.xlsx', sheet_name='Sheet1', index=False)
# df_read = pd.read_excel('output.xlsx', sheet_name='Sheet1') -
JSON 文件、SQL 数据库等:
Pandas 还支持to_json(),read_json(),to_sql(),read_sql()等方法。
4. 总结
本文详细介绍了 Pandas 的基础知识,包括其核心数据结构 Series 和 DataFrame 的创建方法,以及如何利用 loc, iloc, groupby, merge, concat 等常用操作进行数据选择、清洗、转换和聚合。Pandas 的强大功能远不止于此,掌握这些基础知识将为你深入探索数据分析世界打下坚实的基础。
在实际工作中,你还会遇到更多高级主题,如时间序列分析、多级索引、性能优化等。持续学习和实践是提升 Pandas 技能的关键。