1. 为什么需要掌握这些pandas函数?
在数据分析的日常工作中,80%的时间都花在了数据清洗和探索性分析(EDA)上。作为Python生态中最强大的数据处理工具,pandas提供了数百个函数和方法,但真正高频使用的核心函数其实集中在20%的范围内。我整理了实际项目中反复出现的函数清单,这些函数构成了数据分析师的基础工具箱。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据加载与初探
2.1 数据读取三剑客
python复制# 读取CSV文件(含中文路径处理)
df = pd.read_csv('data.csv', encoding='gbk')
# 读取Excel文件(指定sheet)
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
# 读取SQL数据(需配合SQLAlchemy)
from sqlalchemy import create_engine
engine = create_engine('mysql://user:pass@localhost/db')
df = pd.read_sql('SELECT * FROM table', engine)
注意:读取大文件时建议指定dtypes参数或使用chunksize分块读取,可显著降低内存占用
2.2 数据概览方法
python复制df.head(3) # 查看前3行
df.tail() # 默认查看后5行
df.shape # 获取(行数, 列数)
df.info() # 显示数据类型和内存使用
df.describe() # 数值型字段统计量
3. 数据清洗必备技能
3.1 缺失值处理
python复制# 检查缺失值
df.isnull().sum()
# 填充缺失值
df['age'].fillna(df['age'].mean(), inplace=True)
# 删除缺失值
df.dropna(subset=['income'], inplace=True)
3.2 数据类型转换
python复制# 字符串转日期
df['date'] = pd.to_datetime(df['date_str'], format='%Y-%m-%d')
# 类别型编码
df['gender'] = df['gender'].astype('category')
# 数值类型转换
df['price'] = pd.to_numeric(df['price_str'], errors='coerce')
4. 数据筛选与排序
4.1 条件筛选
python复制# 单条件筛选
young = df[df['age'] < 30]
# 多条件组合
result = df[(df['age'] > 25) & (df['income'] > 5000)]
# 字符串模糊查询
df[df['name'].str.contains('张')]
4.2 排序操作
python复制# 单列排序
df.sort_values('age', ascending=False)
# 多列排序
df.sort_values(['department', 'salary'], ascending=[True, False])
5. 数据分组与聚合
5.1 基础分组统计
python复制# 单维度分组
df.groupby('city')['sales'].sum()
# 多维度分组
df.groupby(['year', 'month'])['revenue'].mean()
5.2 高级聚合操作
python复制# 自定义聚合函数
def iqr(series):
return series.quantile(0.75) - series.quantile(0.25)
df.groupby('dept')['salary'].agg(['mean', 'median', iqr])
6. 数据合并与重塑
6.1 表连接操作
python复制# 内连接
pd.merge(df1, df2, on='id')
# 左连接
pd.merge(df1, df2, how='left', left_on='id', right_on='user_id')
# 纵向合并
pd.concat([df1, df2], axis=0)
6.2 数据透视表
python复制# 基础透视表
pd.pivot_table(df, values='sales', index='region', columns='quarter')
# 多维度透视
pd.pivot_table(df, values=['sales','profit'],
index=['year','region'],
aggfunc={'sales':'sum', 'profit':'mean'})
7. 时间序列处理
7.1 时间属性提取
python复制df['year'] = df['date'].dt.year
df['dayofweek'] = df['date'].dt.dayofweek
df['is_weekend'] = df['date'].dt.dayofweek > 4
7.2 重采样与滑动窗口
python复制# 按周重采样
df.set_index('date')['price'].resample('W').mean()
# 滑动平均
df['7d_avg'] = df['sales'].rolling(window=7).mean()
8. 性能优化技巧
8.1 高效迭代方法
python复制# 避免逐行迭代,使用向量化操作
df['discount_price'] = df['price'] * 0.9
# 必须迭代时使用itertuples
for row in df.itertuples():
process(row.name, row.age)
8.2 内存优化
python复制# 查看内存使用
df.memory_usage(deep=True)
# 优化数据类型
df['id'] = df['id'].astype('int32')
df['category'] = df['category'].astype('category')
9. 可视化集成
9.1 直接绘图方法
python复制# 直方图
df['age'].plot.hist(bins=20)
# 箱线图
df.plot.box(column=['salary','bonus'])
# 散点矩阵图
pd.plotting.scatter_matrix(df[['age','income','spending']])
10. 实战案例演示
10.1 销售数据分析
python复制# 读取数据
sales = pd.read_excel('sales_records.xlsx')
# 数据清洗
sales = sales.dropna(subset=['amount'])
sales['date'] = pd.to_datetime(sales['date'])
sales['month'] = sales['date'].dt.month
# 分析维度
monthly_sales = sales.groupby(['year','month'])['amount'].sum().unstack()
top_products = sales.groupby('product')['amount'].sum().nlargest(5)
# 可视化
monthly_sales.plot(kind='bar', stacked=True)
top_products.plot.pie(autopct='%.1f%%')
10.2 用户行为分析
python复制# 计算RFM指标
now = pd.to_datetime('2023-06-01')
rfm = df.groupby('user_id').agg({
'date': lambda x: (now - x.max()).days,
'order_id': 'count',
'amount': 'sum'
}).rename(columns={
'date': 'recency',
'order_id': 'frequency',
'amount': 'monetary'
})
# 分箱处理
rfm['R_score'] = pd.qcut(rfm['recency'], 5, labels=[5,4,3,2,1])
rfm['F_score'] = pd.qcut(rfm['frequency'], 5, labels=[1,2,3,4,5])
rfm['M_score'] = pd.qcut(rfm['monetary'], 5, labels=[1,2,3,4,5])
rfm['RFM'] = rfm['R_score'].astype(str) + rfm['F_score'].astype(str) + rfm['M_score'].astype(str)
11. 常见问题排查
11.1 SettingWithCopyWarning警告
python复制# 错误示范
df[df['age']>30]['income'] = 5000 # 触发警告
# 正确做法
df.loc[df['age']>30, 'income'] = 5000
11.2 内存溢出处理
python复制# 分块读取大文件
chunks = pd.read_csv('huge.csv', chunksize=100000)
result = pd.concat([process(chunk) for chunk in chunks])
# 使用更高效的数据类型
df = df.astype({'id':'int32', 'price':'float32'})
11.3 性能瓶颈优化
python复制# 避免链式操作
# 慢
df[df['age']>30]['income'].mean()
# 快
df.loc[df['age']>30, 'income'].mean()
12. 高级技巧补充
12.1 样式格式化
python复制# 条件格式
def highlight_negative(val):
color = 'red' if val < 0 else 'black'
return f'color: {color}'
df.style.applymap(highlight_negative, subset=['profit'])
12.2 多级索引操作
python复制# 创建多级索引
df.set_index(['year','month'], inplace=True)
# 索引切片
df.loc[(2023, slice(4,6)), :]
# 索引重置
df.reset_index(inplace=True)
12.3 自定义访问器
python复制@pd.api.extensions.register_dataframe_accessor("my")
class CustomAccessor:
def __init__(self, pandas_obj):
self._obj = pandas_obj
def clean_names(self):
"""将列名转为小写并用下划线连接"""
self._obj.columns = (
self._obj.columns
.str.lower()
.str.replace(' ', '_')
)
# 使用自定义访问器
df.my.clean_names()
13. 函数速查表
| 功能类别 | 核心函数 | 典型应用场景 |
|---|---|---|
| 数据读取 | read_csv, read_excel, read_sql | 从各种数据源加载数据 |
| 数据概览 | head, info, describe | 快速了解数据结构和统计特征 |
| 数据清洗 | fillna, dropna, astype | 处理缺失值和类型转换 |
| 数据筛选 | loc, iloc, query | 按条件选择数据子集 |
| 排序操作 | sort_values, sort_index | 按指定字段排序 |
| 分组聚合 | groupby, agg, pivot_table | 数据分组计算和透视分析 |
| 表连接 | merge, concat, join | 多表合并操作 |
| 时间处理 | to_datetime, dt访问器, resample | 时间序列处理和分析 |
| 性能优化 | memory_usage, eval, itertuples | 提升处理效率 |
14. 实战经验分享
在实际项目中,我发现这些技巧特别实用:
- 链式方法:将多个操作串联起来,既简洁又避免创建中间变量
python复制(df.query('age > 18')
.groupby('city')
.agg({'income':'mean'})
.sort_values('income', ascending=False)
.head(10))
- 内存优化组合拳:
python复制# 读取时优化
dtypes = {'id':'int32', 'price':'float32'}
df = pd.read_csv('data.csv', dtype=dtypes, usecols=['id','price','date'])
# 后续处理
df['category'] = df['category'].astype('category')
- 异常值检测技巧:
python复制# 基于标准差
mean, std = df['value'].mean(), df['value'].std()
df[(df['value'] < mean - 3*std) | (df['value'] > mean + 3*std)]
# 基于分位数
low, high = df['value'].quantile([0.01, 0.99])
df[(df['value'] < low) | (df['value'] > high)]
- 处理大型CSV文件:
python复制# 使用迭代器
for chunk in pd.read_csv('bigfile.csv', chunksize=100000):
process(chunk)
# 指定数据类型
dtypes = {'id':'int32', 'text':'category'}
pd.read_csv('bigfile.csv', dtype=dtypes)
