当前位置:首页>python>告别加班!用Python做数据分析,pandas+matplotlib一套带走

告别加班!用Python做数据分析,pandas+matplotlib一套带走

  • 2026-09-10 11:20:11
告别加班!用Python做数据分析,pandas+matplotlib一套带走

告别加班!用Python做数据分析,pandas+matplotlib一套带走

作者:几行代码

老板丢过来一份几万行的Excel,让你"分析分析看看有什么规律"。

你打开Excel,排序、筛选、透视表一顿操作,搞了两个小时还没弄完,老板已经在群里催了。

其实这种活儿,Python几分钟能搞定,而且还能直接出图,拿去汇报领导看了都说好。

今天给你一套数据分析完整方案,从读取数据到出报告,代码都是能直接跑的。


第一步:读取数据,别再手动复制了

不管你的数据在Excel、CSV还是数据库里,pandas都能一句话读进来。

python
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 处理空值

python
# 看看哪些列有空值
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 去重

python
# 查看重复行数量
print(f"重复行数: {df.duplicated().sum()}")

# 删除完全重复的行
df = df.drop_duplicates()

2.3 数据类型转换

python
# 日期字符串转日期类型
df['订单日期'] = pd.to_datetime(df['订单日期'], errors='coerce')

# 字符串转数字(去掉逗号、空格)
df['销售额'] = pd.to_numeric(df['销售额'].str.replace(',', ''), errors='coerce')

# 分类数据用category类型,省内存
df['城市'] = df['城市'].astype('category')

第三步:统计分析,用代码代替透视表

3.1 基础统计

python
# 一键出所有数值列的统计摘要
print(df.describe())

# 单列统计
print(f"平均销售额: {df['销售额'].mean():.2f}")
print(f"最大销售额: {df['销售额'].max():.2f}")
print(f"总销售额: {df['销售额'].sum():.2f}")

3.2 分组统计

python
# 按城市统计销售额
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 时间维度分析

python
# 按月统计趋势
df['月份'] = df['订单日期'].dt.to_period('M')
monthly = df.groupby('月份')['销售额'].sum()

print(monthly)

第四步:数据可视化,汇报用的图一键生成

4.1 柱状图——各城市销售额对比

python
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 折线图——月度销售趋势

python
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 饼图——销售品类占比

python
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()

第五步:导出报告,一键发领导

分析完了,数据得导出来:

python
# 统计结果导出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")

完整代码(整合版)

把上面的流程整合成一个脚本,以后换个文件名就能跑:

python
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))

效果对比

维度手动ExcelPython自动化
数据清洗30分钟10秒
分组统计透视表拖半天1行代码
做图表手动插入+调格式自动生成
可复用性换数据重来改个文件名就跑
出错概率手动操作容易错代码跑一次就对

pip install pandas matplotlib openpyxl

一行命令装好依赖,这套方案就能直接用。

数据分析不是什么高深的东西,工具用对了,任何人都能几分钟出结果。


觉得有用?点个在看,转发给你那个还在手动做透视表的同事看看。关注「几行代码」,每天学点能直接用的编程技巧。

最新文章

随机文章