1. DataFrame基础与项目背景
第一次接触pandas的DataFrame时,我被这个二维表格结构的灵活性震惊了。作为Python数据分析的核心数据结构,DataFrame完美融合了SQL表格的查询能力和Excel表格的直观性。在实际业务场景中,80%的数据分析工作都可以通过DataFrame完成,从简单的数据清洗到复杂的聚合计算。
这个入门案例将带大家用真实的销售数据分析场景,掌握DataFrame的六大核心操作:
- 数据加载与初步观察
- 列操作与数据类型转换
- 条件筛选与排序
- 分组聚合统计
- 缺失值处理
- 简单可视化
提示:建议使用Jupyter Notebook跟随操作,可以实时查看每个步骤的输出结果
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与数据加载
2.1 基础环境配置
我习惯使用Anaconda创建独立环境,避免包冲突:
bash复制conda create -n pyanalysis python=3.8
conda activate pyanalysis
pip install pandas matplotlib openpyxl
2.2 示例数据准备
我们模拟了一份电子产品销售数据(sales_data.xlsx),包含以下字段:
- order_id: 订单编号
- product: 产品名称
- category: 产品类别
- price: 单价
- quantity: 数量
- sale_date: 销售日期
- region: 销售区域
python复制import pandas as pd
# 读取Excel数据
df = pd.read_excel('sales_data.xlsx', engine='openpyxl')
# 查看前5行
print(df.head())
# 查看数据概览
print(df.info())
常见问题:
- 如果遇到xlrd报错,需要安装openpyxl并指定engine参数
- 日期列自动识别为object类型时需要手动转换
- 文件路径建议使用原始字符串(r'path')或双反斜杠
3. 核心数据操作实战
3.1 列操作与类型转换
处理价格和数量的计算时,数据类型非常重要:
python复制# 添加总价列
df['total_price'] = df['price'] * df['quantity']
# 转换日期格式
df['sale_date'] = pd.to_datetime(df['sale_date'])
# 提取月份信息
df['sale_month'] = df['sale_date'].dt.month
# 查看类型变化
print(df.dtypes)
注意:dt访问器只能用于datetime64类型,转换前务必检查
3.2 条件筛选技巧
实际业务中最常用的就是条件筛选:
python复制# 筛选2023年Q1的数据
q1_sales = df[
(df['sale_date'] >= '2023-01-01') &
(df['sale_date'] <= '2023-03-31')
]
# 筛选手机品类且销售额大于5000的记录
high_value = df[
(df['category'] == '手机') &
(df['total_price'] > 5000)
]
# 使用query方法(适合复杂条件)
pc_sales = df.query("category == '电脑' and region in ['华东','华北']")
3.3 排序与去重
销售分析经常需要TOP N统计:
python复制# 按销售额降序
top_sales = df.sort_values('total_price', ascending=False)
# 获取销售额前10的订单
top10 = top_sales.head(10)
# 查看各区域唯一值
print(df['region'].unique())
# 按多列排序
sorted_df = df.sort_values(['region', 'total_price'], ascending=[True, False])
4. 数据分析进阶操作
4.1 分组聚合统计
这是数据分析最核心的功能:
python复制# 按产品类别统计
category_stats = df.groupby('category').agg({
'quantity': 'sum',
'total_price': ['sum', 'mean', 'count']
})
# 多维度透视
region_month = df.pivot_table(
index='region',
columns='sale_month',
values='total_price',
aggfunc='sum',
fill_value=0
)
# 添加占比计算
category_stats['percent'] = category_stats['total_price']['sum'] / category_stats['total_price']['sum'].sum()
4.2 缺失值处理实战
真实数据总会有各种缺失:
python复制# 检查缺失值
print(df.isnull().sum())
# 填充策略
df['price'].fillna(df['price'].median(), inplace=True) # 数值用中位数
df['region'].fillna('未知', inplace=True) # 分类用特定值
# 删除缺失严重的行
df.dropna(subset=['product', 'category'], inplace=True)
5. 数据可视化呈现
5.1 基础图表绘制
python复制import matplotlib.pyplot as plt
# 销售额趋势图
monthly_sales = df.groupby('sale_month')['total_price'].sum()
monthly_sales.plot(kind='bar', title='月度销售额趋势')
plt.ylabel('销售额')
plt.show()
# 品类占比饼图
category_sales = df.groupby('category')['total_price'].sum()
category_sales.plot(
kind='pie',
autopct='%1.1f%%',
startangle=90,
figsize=(8,8)
)
plt.title('销售品类占比')
plt.show()
5.2 高级可视化技巧
python复制# 区域-品类热力图
cross_tab = pd.crosstab(
df['region'],
df['category'],
values=df['total_price'],
aggfunc='sum'
)
plt.figure(figsize=(10,6))
sns.heatmap(cross_tab, annot=True, fmt=".0f", cmap="YlGnBu")
plt.title('区域-品类销售热力图')
plt.show()
# 价格分布箱线图
plt.figure(figsize=(10,6))
df.boxplot(column='price', by='category', grid=False)
plt.title('各品类价格分布')
plt.suptitle('') # 去除自动标题
plt.show()
6. 实战经验与优化建议
6.1 性能优化技巧
处理大数据集时的经验:
python复制# 读取时指定类型
dtypes = {
'order_id': 'str',
'price': 'float32',
'quantity': 'int16'
}
df = pd.read_excel('sales_data.xlsx', dtype=dtypes)
# 使用category类型优化
df['category'] = df['category'].astype('category')
df['region'] = df['region'].astype('category')
# 分块处理大文件
chunk_size = 10000
chunks = pd.read_excel('large_data.xlsx', chunksize=chunk_size)
results = []
for chunk in chunks:
results.append(chunk.groupby('category').size())
final_result = pd.concat(results).groupby(level=0).sum()
6.2 常见问题排查
-
SettingWithCopyWarning警告
- 明确使用copy()或.loc[]索引
- 避免链式赋值操作
-
内存不足问题
- 使用dtype参数减少内存占用
- 考虑使用Dask替代pandas处理超大数据
-
日期解析错误
- 明确指定日期格式:pd.to_datetime(df['date'], format='%Y-%m-%d')
- 处理混合格式时设置errors='coerce'
-
合并数据时的索引问题
- 重置索引:df.reset_index(drop=True, inplace=True)
- 合并时注意left_index/right_index参数
7. 项目扩展方向
掌握了基础操作后,可以尝试:
- 连接数据库获取实时数据
python复制from sqlalchemy import create_engine
engine = create_engine('postgresql://user:pass@localhost:5432/db')
sql_df = pd.read_sql('SELECT * FROM sales', engine)
- 构建自动化分析报告
python复制from pandas_profiling import ProfileReport
profile = ProfileReport(df, title='销售分析报告')
profile.to_file("report.html")
- 集成机器学习预测
python复制from sklearn.linear_model import LinearRegression
# 准备特征矩阵和目标变量
X = df[['price', 'month', 'region_code']]
y = df['quantity']
model = LinearRegression().fit(X, y)
这个DataFrame入门案例已经涵盖了90%的日常分析场景。实际项目中,我发现最重要的不是记住所有方法,而是理解数据背后的业务逻辑。每次开始新分析前,先花时间了解数据字典和业务背景,往往能事半功倍。
