Python 数据分析三剑客:NumPy、Pandas、Matplotlib 入门实战

小飞兽 Python 6 次阅读 2026-07-24

Introduction

Python 数据分析的三驾马车是 NumPy(数值计算)、Pandas(表格数据)、Matplotlib(可视化)。本文用一份真实数据集,讲解从数据读取、清洗、分析到可视化的完整流程。

---

环境安装

pip install numpy pandas matplotlib jupyter
# 或用 Anaconda(全家桶)

NumPy:数值计算

import numpy as np

# 数组创建
arr = np.array([1, 2, 3, 4, 5])
zeros = np.zeros((3, 4))  # 3x4 零矩阵
rand = np.random.randn(1000)  # 1000个标准正态随机数

# 向量化运算
arr * 2          # [2, 4, 6, 8, 10]
arr ** 2         # [1, 4, 9, 16, 25]
np.sqrt(arr)     # [1.0, 1.414, 1.732, 2.0]

# 数组切片
matrix = np.array([[1,2,3], [4,5,6], [7,8,9]])
matrix[1:, :2]   # [[4,5], [7,8]]

# 统计
print(f"均值: {rand.mean():.3f}, 标准差: {rand.std():.3f}")
print(f"最大: {rand.max():.3f}, 最小: {rand.min():.3f}")

Pandas:表格数据处理

import pandas as pd

# 读取数据
df = pd.read_csv('sales.csv')
print(df.head())
print(df.info())
print(df.describe())

# 选择列
df[['日期', '销售额', '产品']].head()

# 筛选
df[df['销售额'] > 1000]
df[(df['类别'] == '电子产品') & (df['销售额'] > 500)]

# 新增列
df['利润率'] = (df['利润'] / df['销售额'] * 100).round(2)

# 排序
df.sort_values('销售额', ascending=False).head(10)

# 分组统计
df.groupby('类别')['销售额'].agg(['sum', 'mean', 'count']).round(2)

# 时间序列
df['日期'] = pd.to_datetime(df['日期'])
df.set_index('日期', inplace=True)
df.resample('M')['销售额'].sum()  # 按月汇总
df['2026-01': '2026-06']['销售额'].plot()  # 趋势图

Matplotlib:数据可视化

import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.family'] = ['DejaVu Sans']

# 折线图
plt.figure(figsize=(10, 6))
plt.plot(df.index, df['销售额'], label='销售额', color='steelblue')
plt.plot(df.index, df['利润'], label='利润', color='orange')
plt.title('2026年销售趋势', fontsize=14)
plt.xlabel('月份')
plt.ylabel('金额(元)')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('sales_trend.png', dpi=150)
plt.show()

# 柱状图
df.groupby('类别')['销售额'].sum().sort_values().plot(kind='barh', color='teal')
plt.title('各类别销售额对比')
plt.tight_layout()
plt.savefig('category_sales.png', dpi=150)

# 饼图
df['类别'].value_counts().plot(kind='pie', autopct='%1.1f%%', figsize=(8, 8))
plt.title('产品类别占比')
plt.savefig('category_pie.png', dpi=150)

完整数据分析实例

import pandas as pd
import matplotlib.pyplot as plt

# 1. 读取
df = pd.read_csv('customer_data.csv')
df['注册日期'] = pd.to_datetime(df['注册日期'])

# 2. 清洗
df.dropna(subset=['手机号'], inplace=True)
df = df[df['消费金额'] > 0]
df['消费金额'] = df['消费金额'].astype(float)

# 3. 分析
monthly = df.set_index('消费日期').resample('ME')['消费金额'].agg(['sum', 'count', 'mean'])
monthly.columns = ['月度销售额', '订单数', '客单价']
print(monthly.round(2))

# 4. 可视化
fig, axes = plt.subplots(1, 3, figsize=(15, 5))
monthly['月度销售额'].plot(ax=axes[0], kind='bar', color='steelblue')
axes[0].set_title('月度销售额')
monthly['客单价'].plot(ax=axes[1], color='orange')
axes[1].set_title('客单价趋势')
df.groupby('省份')['消费金额'].sum().sort_values(ascending=False).head(10).plot(
    ax=axes[2], kind='barh', color='teal')
axes[2].set_title('Top 10 省份')
plt.tight_layout()
plt.savefig('analysis.png', dpi=150)

常见问题

Q1: NumPy 和 Pandas 性能差异?NumPy 的 ndarray 是连续内存数组,适合大规模数值计算;Pandas 的 DataFrame 基于 NumPy,加了行列索引和列名,更适合表格数据分析。

Q2: Matplotlib 中文显示问题?设置 matplotlib.rcParams['font.family'] 为中文字体(如 'SimHei' 或 'WenQuanYi Micro Hei'),或者用 plt.rcParams['font.sans-serif'] 配置。

Q3: 数据量很大(GB级别)怎么办?用 chunk 分块读取:pd.read_csv('big.csv', chunksize=100000),或者用 Dask/PySpark 分布式计算。

延伸阅读

  • Pandas 数据清洗技巧
  • Matplotlib 高阶图表
  • Python 数据分析项目结构

---

作者:小马 | 绍大技术网 shaoda.net