告别加班!用Python做数据分析,pandas+matplotlib一套带走
作者:几行代码
老板丢过来一份几万行的Excel,让你"分析分析看看有什么规律"。
你打开Excel,排序、筛选、透视表一顿操作,搞了两个小时还没弄完,老板已经在群里催了。
其实这种活儿,Python几分钟能搞定,而且还能直接出图,拿去汇报领导看了都说好。
今天给你一套数据分析完整方案,从读取数据到出报告,代码都是能直接跑的。
第一步:读取数据,别再手动复制了
不管你的数据在Excel、CSV还是数据库里,pandas都能一句话读进来。
import pandas as pd
# 读Excel
df = pd.read_excel("销售数据.xlsx", sheet_name="Sheet1")
# 读CSV
# df = pd.read_csv("销售数据.csv", encoding="utf-8")
# 看看数据长什么样
print(df.shape) # 几行几列
print(df.columns) # 列名
print(df.head()) # 前5行
print(df.dtypes) # 每列的数据类型
小技巧:数据量大的时候,先看前几行确认格式对不对,别上来就全量跑。
第二步:数据清洗,80%的时间都在干这事儿
数据分析行业有句话——80%的时间在清洗数据,20%的时间在做分析。
2.1 处理空值
# 看看哪些列有空值
print(df.isnull().sum())
# 空值太多(超过50%)的列直接删掉
df = df.loc[:, df.isnull().mean() < 0.5]
# 数值列的空值用中位数填充
num_cols = df.select_dtypes(include=['number']).columns
df[num_cols] = df[num_cols].fillna(df[num_cols].median())
# 字符串列的空值用"未知"填充
str_cols = df.select_dtypes(include=['object']).columns
df[str_cols] = df[str_cols].fillna("未知")
2.2 去重
# 查看重复行数量
print(f"重复行数: {df.duplicated().sum()}")
# 删除完全重复的行
df = df.drop_duplicates()
2.3 数据类型转换
# 日期字符串转日期类型
df['订单日期'] = pd.to_datetime(df['订单日期'], errors='coerce')
# 字符串转数字(去掉逗号、空格)
df['销售额'] = pd.to_numeric(df['销售额'].str.replace(',', ''), errors='coerce')
# 分类数据用category类型,省内存
df['城市'] = df['城市'].astype('category')
第三步:统计分析,用代码代替透视表
3.1 基础统计
# 一键出所有数值列的统计摘要
print(df.describe())
# 单列统计
print(f"平均销售额: {df['销售额'].mean():.2f}")
print(f"最大销售额: {df['销售额'].max():.2f}")
print(f"总销售额: {df['销售额'].sum():.2f}")
3.2 分组统计
# 按城市统计销售额
city_stats = df.groupby('城市')['销售额'].agg(
总销售额='sum',
平均销售额='mean',
订单数='count'
).sort_values('总销售额', ascending=False)
print(city_stats)
输出长这样:
| 城市 | 总销售额 | 平均销售额 | 订单数 |
|---|
| 上海 | 520万 | 1.3万 | 400 |
| 北京 | 480万 | 1.2万 | 400 |
| 深圳 | 390万 | 1.1万 | 354 |
3.3 时间维度分析
# 按月统计趋势
df['月份'] = df['订单日期'].dt.to_period('M')
monthly = df.groupby('月份')['销售额'].sum()
print(monthly)
第四步:数据可视化,汇报用的图一键生成
4.1 柱状图——各城市销售额对比
import matplotlib.pyplot as plt
# 设置中文字体(Windows)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 柱状图
fig, ax = plt.subplots(figsize=(10, 6))
city_stats['总销售额'].head(10).plot(kind='bar', ax=ax, color='#4A90D9')
ax.set_title('各城市销售额TOP10', fontsize=16)
ax.set_xlabel('城市', fontsize=12)
ax.set_ylabel('销售额(元)', fontsize=12)
ax.set_xticklabels(ax.get_xticklabels(), rotation=45, ha='right')
# 在柱子上加数字
for i, v in enumerate(city_stats['总销售额'].head(10)):
ax.text(i, v + 10000, f'{v/10000:.1f}万', ha='center', fontsize=9)
plt.tight_layout()
plt.savefig('城市销售额对比.png', dpi=150)
plt.show()
4.2 折线图——月度销售趋势
fig, ax = plt.subplots(figsize=(10, 5))
monthly.plot(kind='line', ax=ax, marker='o', color='#E74C3C', linewidth=2)
ax.set_title('月度销售趋势', fontsize=16)
ax.set_xlabel('月份', fontsize=12)
ax.set_ylabel('销售额(元)', fontsize=12)
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('月度销售趋势.png', dpi=150)
plt.show()
4.3 饼图——销售品类占比
category_stats = df.groupby('品类')['销售额'].sum().sort_values(ascending=False)
fig, ax = plt.subplots(figsize=(8, 8))
category_stats.head(6).plot(kind='pie', ax=ax, autopct='%1.1f%%',
colors=['#4A90D9', '#E74C3C', '#2ECC71', '#F39C12', '#9B59B6', '#1ABC9C'])
ax.set_title('销售品类占比', fontsize=16)
ax.set_ylabel('') # 去掉y轴标签
plt.tight_layout()
plt.savefig('品类占比.png', dpi=150)
plt.show()
第五步:导出报告,一键发领导
分析完了,数据得导出来:
# 统计结果导出Excel(带格式)
with pd.ExcelWriter('数据分析报告.xlsx', engine='openpyxl') as writer:
city_stats.to_excel(writer, sheet_name='城市统计')
category_stats.to_excel(writer, sheet_name='品类统计')
# 自动调整列宽
for sheet_name in writer.sheets:
worksheet = writer.sheets[sheet_name]
for col in worksheet.columns:
max_length = max(len(str(cell.value or '')) for cell in col)
worksheet.column_dimensions[col[0].column_letter].width = max_length + 4
print("报告已生成: 数据分析报告.xlsx")
完整代码(整合版)
把上面的流程整合成一个脚本,以后换个文件名就能跑:
import pandas as pd
import matplotlib.pyplot as plt
def analyze_sales(filepath):
"""一键数据分析"""
# 1. 读取数据
df = pd.read_excel(filepath)
print(f"数据加载完成: {df.shape[0]}行, {df.shape[1]}列")
# 2. 数据清洗
df = df.drop_duplicates()
num_cols = df.select_dtypes(include=['number']).columns
df[num_cols] = df[num_cols].fillna(df[num_cols].median())
# 3. 统计分析
city_stats = df.groupby('城市')['销售额'].agg(
总销售额='sum', 平均销售额='mean', 订单数='count'
).sort_values('总销售额', ascending=False)
# 4. 可视化
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
fig, axes = plt.subplots(1, 2, figsize=(16, 6))
city_stats['总销售额'].head(10).plot(kind='bar', ax=axes[0], color='#4A90D9')
axes[0].set_title('城市销售额TOP10')
axes[0].set_xticklabels(axes[0].get_xticklabels(), rotation=45, ha='right')
category_stats = df.groupby('品类')['销售额'].sum().sort_values(ascending=False)
category_stats.head(6).plot(kind='pie', ax=axes[1], autopct='%1.1f%%')
axes[1].set_title('品类占比')
axes[1].set_ylabel('')
plt.tight_layout()
plt.savefig('数据分析报告.png', dpi=150)
print("图表已保存: 数据分析报告.png")
# 5. 导出Excel
with pd.ExcelWriter('数据分析报告.xlsx') as writer:
city_stats.to_excel(writer, sheet_name='城市统计')
category_stats.to_excel(writer, sheet_name='品类统计')
print("报告已导出: 数据分析报告.xlsx")
return city_stats
if __name__ == '__main__':
result = analyze_sales("销售数据.xlsx")
print(result.head(10))
效果对比
| 维度 | 手动Excel | Python自动化 |
|---|
| 数据清洗 | 30分钟 | 10秒 |
| 分组统计 | 透视表拖半天 | 1行代码 |
| 做图表 | 手动插入+调格式 | 自动生成 |
| 可复用性 | 换数据重来 | 改个文件名就跑 |
| 出错概率 | 手动操作容易错 | 代码跑一次就对 |
pip install pandas matplotlib openpyxl 一行命令装好依赖,这套方案就能直接用。
数据分析不是什么高深的东西,工具用对了,任何人都能几分钟出结果。
觉得有用?点个在看,转发给你那个还在手动做透视表的同事看看。关注「几行代码」,每天学点能直接用的编程技巧。