Pandas从入门到精通
Pandas是Python数据分析的核心库,提供Series和DataFrame两种核心数据结构。本文从基础到进阶详细介绍了Pandas的常用功能,包括数据读取/保存、清洗/探索、操作/分析、合并/重塑、可视化等核心操作。进阶部分讲解了高级索引、数据转换、缺失值处理、性能优化、窗口函数、时间序列处理等高级功能,以及与SQL、机器学习的集成方法。文章还提供了学生成绩分析的实战案例和性能优化建议,最后
·
pandas 入门与常用用法详解
pandas 是 Python 中用于数据处理和分析的核心库,提供了高效的数据结构和数据分析工具。以下从基础到进阶,全面介绍 pandas 的常用用法。
一、核心数据结构
1. Series(一维数组)
import pandas as pd
import numpy as np
# 创建 Series
s = pd.Series([10, 20, 30, 40], index=['a', 'b', 'c', 'd'])
print(s)
# a 10
# b 20
# c 30
# d 40
# dtype: int64
# 访问元素
print(s['a']) # 10
print(s[0]) # 10
# 切片
print(s[1:3]) # b 20\nc 30
2. DataFrame(二维表格)
# 创建 DataFrame
data = {
'姓名': ['张三', '李四', '王五'],
'年龄': [25, 30, 22],
'分数': [85.5, 90.0, 78.5]
}
df = pd.DataFrame(data)
print(df)
# 姓名 年龄 分数
# 0 张三 25 85.5
# 1 李四 30 90.0
# 2 王五 22 78.5
# 查看基本信息
print(df.info()) # 数据类型和非空值统计
print(df.describe()) # 数值列的统计摘要
二、数据读取与保存
1. 读取数据
# 从 CSV 读取
df_csv = pd.read_csv('data.csv')
# 从 Excel 读取
df_excel = pd.read_excel('data.xlsx', sheet_name='Sheet1')
# 从 SQL 读取
import sqlalchemy as sa
engine = sa.create_engine('sqlite:///database.db')
df_sql = pd.read_sql('SELECT * FROM users', engine)
# 从 JSON 读取
df_json = pd.read_json('data.json')
2. 保存数据
# 保存为 CSV
df.to_csv('output.csv', index=False) # index=False 不保存索引列
# 保存为 Excel
df.to_excel('output.xlsx', sheet_name='数据', index=False)
# 保存为 SQL
df.to_sql('users_new', engine, if_exists='replace')
三、数据探索与清洗
1. 数据查看
print(df.head()) # 查看前5行
print(df.tail(3)) # 查看后3行
print(df.shape) # 查看行列数 (3, 3)
print(df.columns) # 查看列名 Index(['姓名', '年龄', '分数'], dtype='object')
2. 处理缺失值
# 查看缺失值
print(df.isnull().sum()) # 各列缺失值数量
# 丢弃缺失值
df_clean = df.dropna()
# 填充缺失值
df_filled = df.fillna(0) # 用0填充
df_filled = df.fillna(method='ffill') # 用前一个值填充
3. 数据类型转换
# 转换年龄列为字符串
df['年龄'] = df['年龄'].astype(str)
# 转换分数列为整数(向下取整)
df['分数'] = df['分数'].astype(int)
四、数据操作与分析
1. 数据筛选与过滤
# 按条件筛选
young_people = df[df['年龄'] < 25]
# 多条件筛选
high_score = df[(df['分数'] > 80) & (df['年龄'] < 30)]
# 按索引筛选
print(df.loc[0]) # 按标签索引
print(df.iloc[0]) # 按位置索引
print(df.loc[[0, 2]]) # 筛选多行
2. 数据排序
# 按年龄升序排序
df_sorted = df.sort_values('年龄')
# 按分数降序排序
df_sorted = df.sort_values('分数', ascending=False)
# 多列排序
df_sorted = df.sort_values(['年龄', '分数'])
3. 数据分组与聚合
# 按年龄分组并计算分数平均值
grouped = df.groupby('年龄')['分数'].mean()
# 多列聚合
agg_data = df.groupby('年龄').agg({
'分数': 'mean',
'姓名': 'count'
})
# 分组后应用函数
def get_top_score(group):
return group.nlargest(1, '分数')
top_scores = df.groupby('年龄').apply(get_top_score)
五、数据合并与重塑
1. 合并数据
# 纵向合并(追加)
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})
combined = pd.concat([df1, df2])
# 横向合并(连接)
df3 = pd.DataFrame({'A': [1, 2], 'C': [9, 10]})
merged = pd.merge(df1, df3, on='A') # 按A列合并
2. 数据透视表
# 创建透视表
pivot = pd.pivot_table(df, index='姓名', columns='年龄', values='分数', aggfunc='mean')
# 交叉表
crosstab = pd.crosstab(df['姓名'], df['年龄'])
六、数据可视化
pandas 与 matplotlib/seaborn 结合可轻松可视化数据:
import matplotlib.pyplot as plt
# 绘制柱状图
df.plot(kind='bar', x='姓名', y='分数', title='分数分布')
plt.show()
# 绘制折线图
time_series = pd.Series([10, 15, 12, 18, 20], index=pd.date_range('2023-01-01', periods=5))
time_series.plot(kind='line')
plt.show()
# 绘制饼图
df['年龄'].value_counts().plot(kind='pie', autopct='%1.1f%%')
plt.show()
七、高级功能:时间序列处理
# 创建时间序列
dates = pd.date_range('2023-01-01', periods=5, freq='D')
ts = pd.Series([10, 12, 15, 11, 14], index=dates)
# 重采样(将日数据转为周数据求和)
weekly_sum = ts.resample('W').sum()
# 滚动窗口计算
rolling_mean = ts.rolling(window=2).mean()
八、性能优化技巧
- 向量化操作:避免循环,使用 pandas 内置函数
# 低效写法 # for i in range(len(df)): # df.loc[i, '分数翻倍'] = df.loc[i, '分数'] * 2 # 高效写法 df['分数翻倍'] = df['分数'] * 2 - 使用 dtype 优化:指定合适的数据类型减少内存占用
df['年龄'] = df['年龄'].astype('int8') # 若年龄范围小,用 int8 代替 int64 - 分块处理大数据:
# 分块读取大文件 chunks = pd.read_csv('large_file.csv', chunksize=1000) for chunk in chunks: # 处理每个数据块 processed_chunk = chunk.dropna() # ...
九、实战案例:学生成绩分析
# 假设已有学生成绩数据
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'数学': [85, 92, 78, 88],
'英语': [76, 88, 90, 82],
'语文': [90, 85, 82, 79]
}
df = pd.DataFrame(data)
# 1. 计算总分和平均分
df['总分'] = df[['数学', '英语', '语文']].sum(axis=1)
df['平均分'] = df[['数学', '英语', '语文']].mean(axis=1)
# 2. 找出各科最高分学生
max_scores = df[['姓名', '数学', '英语', '语文']].set_index('姓名').idxmax()
print("各科最高分学生:", max_scores)
# 3. 分析分数分布
print("数学分数描述统计:", df['数学'].describe())
# 4. 可视化
df[['数学', '英语', '语文']].plot(kind='box')
plt.title('各科分数箱线图')
plt.show()
总结
pandas 是数据处理的核心工具,掌握以上用法可应对大部分数据处理需求。进阶学习可关注:
pandas官方文档:pandas - Python Data Analysis Library- 时间序列分析(
pd.Timestamp,pd.date_range) - 数据清洗与特征工程
- 与其他库(如 numpy, scikit-learn)的集成
通过大量实践(如 Kaggle 数据集练习),可逐步提升 pandas 应用能力。
pandas 进阶学习指南
掌握 pandas 基础后,进阶学习可大幅提升数据处理效率和代码质量。以下从高级数据操作、性能优化、复杂分析到与其他工具集成,提供系统性的进阶路径。
一、高级数据处理技巧
1. 高级索引与选择
# 1.1 多层索引(MultiIndex)
arrays = [['bar', 'bar', 'baz', 'baz'], ['one', 'two', 'one', 'two']]
index = pd.MultiIndex.from_arrays(arrays, names=['first', 'second'])
df = pd.DataFrame({'A': [1, 2, 3, 4]}, index=index)
# 选择第一层索引
print(df.loc['bar'])
# 交叉选择
print(df.xs('one', level='second'))
# 1.2 布尔索引高级用法
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
mask = df['A'].between(1, 2)
print(df[mask])
# 1.3 query() 方法
print(df.query('A > 1 and B < 6'))
2. 数据转换与映射
# 2.1 map() 应用于 Series
df = pd.DataFrame({'A': ['a', 'b', 'a'], 'B': [1, 2, 3]})
mapping = {'a': 'apple', 'b': 'banana'}
df['A_mapped'] = df['A'].map(mapping)
# 2.2 apply() 应用于 DataFrame
def multiply_by_two(x):
return x * 2
df['B_doubled'] = df['B'].apply(multiply_by_two)
# 2.3 applymap() 应用于全量元素
df = df.applymap(lambda x: str(x).upper() if isinstance(x, str) else x)
3. 缺失值高级处理
# 3.1 插值填充
df = pd.DataFrame({'A': [1, np.nan, 3, np.nan, 5]})
df['A_interpolated'] = df['A'].interpolate(method='linear')
# 3.2 缺失值预测模型
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy='median')
df['A_imputed'] = imputer.fit_transform(df[['A']])
二、性能优化与内存管理
1. 高效数据类型
# 1.1 使用 category 替代 object
df['A'] = df['A'].astype('category') # 节省内存,提升排序/分组速度
# 1.2 数值类型优化
df['B'] = df['B'].astype('int8') # 适用于范围小的整数
df['C'] = df['C'].astype('float32') # 降低浮点数精度节省内存
2. 向量化操作 vs 循环
# 低效:循环操作
result = []
for i in range(len(df)):
result.append(df.iloc[i]['A'] * 2)
# 高效:向量化操作
result = df['A'] * 2
# 更高效:numba 加速
from numba import njit
@njit
def compute_squares(arr):
result = np.empty_like(arr)
for i in range(len(arr)):
result[i] = arr[i] ** 2
return result
df['A_squared'] = compute_squares(df['A'].values)
3. 内存优化工具
# 查看内存占用
print(df.memory_usage(deep=True))
# 分块处理大文件
chunksize = 1000
for chunk in pd.read_csv('large_file.csv', chunksize=chunksize):
# 处理每个数据块
processed_chunk = chunk[chunk['A'] > 100]
processed_chunk.to_csv('output.csv', mode='a', header=not os.path.exists('output.csv'))
三、复杂数据处理与分析
1. 窗口函数
# 1.1 滚动窗口
df = pd.DataFrame({'A': [1, 2, 3, 4, 5]})
df['rolling_mean'] = df['A'].rolling(window=3).mean()
# 1.2 扩展窗口(累计计算)
df['expanding_sum'] = df['A'].expanding().sum()
# 1.3 指数加权窗口
df['ewm_mean'] = df['A'].ewm(alpha=0.3).mean()
2. 时间序列高级处理
# 2.1 时区处理
ts = pd.Series(pd.date_range('2023-01-01', periods=3, tz='UTC'))
ts_localized = ts.dt.tz_convert('Asia/Shanghai')
# 2.2 移动/滞后
df['A_shifted'] = df['A'].shift(1) # 滞后1期
df['A_lead'] = df['A'].shift(-1) # 超前1期
# 2.3 时间序列重采样
ts = pd.Series(np.random.randn(1000), index=pd.date_range('2023-01-01', periods=1000))
daily_to_weekly = ts.resample('W').mean()
3. 分组高级应用
# 3.1 分组后应用多个聚合函数
df.groupby('category').agg({'A': ['sum', 'mean'], 'B': ['min', 'max']})
# 3.2 分组后转换
df['group_mean'] = df.groupby('category')['A'].transform('mean')
# 3.3 分组后过滤
df_filtered = df.groupby('category').filter(lambda x: x['A'].mean() > 10)
四、与其他工具集成
1. 与 SQL 对比与互操作
# SQL 风格查询
result = df.query('A > 1 and B < 10')
# DataFrame 转 SQL
from sqlalchemy import create_engine
engine = create_engine('sqlite:///mydata.db')
df.to_sql('mytable', con=engine, if_exists='replace')
# SQL 查询到 DataFrame
query_result = pd.read_sql('SELECT * FROM mytable WHERE A > 1', engine)
2. 与机器学习集成
# 2.1 特征工程
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df['A_scaled'] = scaler.fit_transform(df[['A']])
# 2.2 与 scikit-learn 管道集成
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.ensemble import RandomForestRegressor
pipeline = Pipeline([
('imputer', SimpleImputer(strategy='median')),
('model', RandomForestRegressor())
])
# 2.3 交叉验证
from sklearn.model_selection import cross_val_score
X = df[['A', 'B']]
y = df['target']
scores = cross_val_score(pipeline, X, y, cv=5)
3. 并行计算
# 使用 pandarallel 并行加速
from pandarallel import pandarallel
pandarallel.initialize()
def complex_operation(row):
# 复杂计算逻辑
return row['A'] ** 2 + row['B'] ** 3
df['result'] = df.parallel_apply(complex_operation, axis=1)
五、实用技巧与最佳实践
1. 条件赋值
# np.where()
df['label'] = np.where(df['A'] > 10, 'high', 'low')
# df.loc[]
df.loc[df['A'] > 10, 'label'] = 'high'
df.loc[df['A'] <= 10, 'label'] = 'low'
2. 自定义聚合函数
def custom_agg(x):
return x.max() - x.min()
df.groupby('category')['A'].agg(custom_agg)
3. 合并多个 DataFrame
# 多 DataFrame 合并
dfs = [df1, df2, df3]
combined = pd.concat(dfs, ignore_index=True)
# 合并时保留来源信息
combined = pd.concat(dfs, keys=['df1', 'df2', 'df3'])
4. 数据透视表高级应用
# 多级透视表
pivot = pd.pivot_table(
df,
index=['category', 'subcategory'],
columns='year',
values='sales',
aggfunc=['sum', 'mean']
)
六、性能调优实战案例
场景:处理 1GB+ 的 CSV 文件,包含用户行为数据,需计算每日活跃用户数。
优化前代码:
# 内存占用高,速度慢
df = pd.read_csv('big_data.csv')
df['date'] = pd.to_datetime(df['timestamp'])
daily_active = df.groupby(df['date'].dt.date)['user_id'].nunique()
优化后代码:
# 分块处理 + 类型优化
chunksize = 100000
result = pd.Series(dtype='int64')
for chunk in pd.read_csv('big_data.csv', chunksize=chunksize):
# 优化数据类型
chunk['user_id'] = chunk['user_id'].astype('category')
# 转换日期
chunk['date'] = pd.to_datetime(chunk['timestamp']).dt.date
# 分块聚合
chunk_agg = chunk.groupby('date')['user_id'].nunique()
result = result.add(chunk_agg, fill_value=0)
print(result)
七、学习资源推荐
-
官方文档:
-
经典书籍:
- 《Python 数据分析实战》(Wes McKinney,pandas 作者)
- 《Python 数据科学手册》
-
进阶课程:
- Coursera: Applied Data Science with Python
- Kaggle: Pandas 高级教程
-
性能优化:
总结
pandas 进阶学习的核心在于:
- 数据处理效率:掌握向量化操作、内存优化和并行计算
- 复杂分析能力:熟练运用窗口函数、时间序列和多级聚合
- 工具集成:与 SQL、机器学习和大数据工具无缝对接
- 最佳实践:避免低效循环,合理使用 pandas 内置函数
通过持续练习真实数据集(如 Kaggle 竞赛),结合性能监控工具(如 %timeit),可逐步掌握这些高级技巧。
更多推荐

所有评论(0)