Python数据科学入门:从零开始掌握Pandas数据分析
如果你想用Python做数据分析,Pandas是你必须掌握的第一个工具。它是数据科学家手中的”Excel”,但强大得多。
本文将带你从零开始,一步步掌握Pandas的核心用法。
为什么选择Pandas?
| 特性 | Excel | Pandas |
|---|---|---|
| 数据量 | 百万行卡顿 | 千万行流畅 |
| 自动化 | 需要VBA | 原生Python |
| 可重复性 | 难以复现 | 完全可复现 |
| 可视化 | 内置 | 配合Matplotlib |
| 学习曲线 | 低 | 中等 |
环境准备
安装
# 最简单的方式
pip install pandas
# 推荐:安装完整的数据科学套件
pip install pandas numpy matplotlib seaborn jupyter
启动Jupyter Notebook
jupyter notebook
Jupyter是数据科学的标准开发环境,支持代码、图表、文档混排。
Pandas核心概念
1. Series:一维数据
import pandas as pd
# 创建Series
s = pd.Series([10, 20, 30, 40], index=['a', 'b', 'c', 'd'])
print(s)
# 输出:
# a 10
# b 20
# c 30
# d 40
# dtype: int64
2. DataFrame:二维表格
# 创建DataFrame
df = pd.DataFrame({
'name': ['张三', '李四', '王五'],
'age': [25, 30, 35],
'city': ['北京', '上海', '广州']
})
print(df)
# 输出:
# name age city
# 0 张三 25 北京
# 1 李四 30 上海
# 2 王五 35 广州
数据读取与导出
读取各种格式
# CSV文件
df = pd.read_csv('data.csv')
# Excel文件
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
# JSON文件
df = pd.read_json('data.json')
# SQL数据库
import sqlite3
conn = sqlite3.connect('database.db')
df = pd.read_sql('SELECT * FROM users', conn)
导出数据
# 导出为CSV
df.to_csv('output.csv', index=False)
# 导出为Excel
df.to_excel('output.xlsx', sheet_name='结果', index=False)
数据探索:了解你的数据
基本信息查看
# 查看前5行
df.head()
# 查看后5行
df.tail()
# 数据概览
df.info()
# 统计摘要
df.describe()
# 列名
df.columns
# 数据形状(行数, 列数)
df.shape
实战示例:分析销售数据
import pandas as pd
# 读取销售数据
sales = pd.read_csv('sales_data.csv')
# 查看基本信息
print(f"数据维度: {sales.shape}")
print(f"列名: {sales.columns.tolist()}")
# 查看数据类型
print(sales.dtypes)
# 快速统计
print(sales.describe())
数据选择与过滤
选择数据
# 选择单列
df['name']
# 选择多列
df[['name', 'age']]
# 按位置选择
df.iloc[0] # 第一行
df.iloc[0:3] # 前3行
df.iloc[0, 1] # 第1行第2列
# 按标签选择
df.loc[0] # 索引为0的行
df.loc[0:2, 'name'] # 指定行列
条件过滤
# 单条件
df[df['age'] > 30]
# 多条件
df[(df['age'] > 25) & (df['city'] == '北京')]
# 包含判断
df[df['city'].isin(['北京', '上海'])]
# 字符串包含
df[df['name'].str.contains('张')]
数据清洗
处理缺失值
# 检查缺失值
df.isnull().sum()
# 删除含缺失值的行
df.dropna()
# 填充缺失值
df.fillna(0) # 用0填充
df.fillna(df.mean()) # 用均值填充
df['age'].fillna(df['age'].median()) # 用中位数填充
处理重复值
# 检查重复
df.duplicated().sum()
# 删除重复
df.drop_duplicates()
数据类型转换
# 转换类型
df['age'] = df['age'].astype(float)
# 日期转换
df['date'] = pd.to_datetime(df['date'])
数据分析与聚合
分组统计
# 按城市分组,计算平均年龄
df.groupby('city')['age'].mean()
# 多种统计
df.groupby('city')['age'].agg(['mean', 'max', 'min', 'count'])
# 多列分组
df.groupby(['city', 'gender'])['age'].mean()
数据透视表
# 创建透视表
pivot = pd.pivot_table(
df,
values='sales',
index='city',
columns='month',
aggfunc='sum'
)
实战:销售数据分析
import pandas as pd
# 读取数据
sales = pd.read_csv('sales.csv')
# 按产品类别统计
category_stats = sales.groupby('category').agg({
'revenue': 'sum',
'quantity': 'sum',
'order_id': 'count'
}).rename(columns={'order_id': 'order_count'})
# 计算客单价
category_stats['avg_order_value'] = category_stats['revenue'] / category_stats['order_count']
# 按收入排序
category_stats.sort_values('revenue', ascending=False)
数据可视化
Pandas内置了便捷的绘图功能:
import matplotlib.pyplot as plt
# 折线图
df['sales'].plot()
plt.show()
# 柱状图
df.groupby('category')['sales'].sum().plot(kind='bar')
plt.show()
# 直方图
df['age'].hist(bins=20)
plt.show()
# 散点图
df.plot.scatter(x='age', y='income')
plt.show()
进阶技巧
合并数据
# 类似SQL的JOIN
pd.merge(df1, df2, on='id', how='left')
# 拼接
pd.concat([df1, df2], axis=0) # 纵向拼接
pd.concat([df1, df2], axis=1) # 横向拼接
应用函数
# 对每行应用函数
df['new_column'] = df.apply(lambda row: row['a'] + row['b'], axis=1)
# 对单列应用函数
df['name_upper'] = df['name'].str.upper()
时间序列处理
# 设置时间索引
df['date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)
# 重采样
df.resample('M').sum() # 按月汇总
df.resample('W').mean() # 按周平均
# 滚动窗口
df['rolling_avg'] = df['value'].rolling(window=7).mean()
完整实战案例
import pandas as pd
import matplotlib.pyplot as plt
# 1. 读取数据
df = pd.read_csv('ecommerce_orders.csv')
# 2. 数据清洗
df['order_date'] = pd.to_datetime(df['order_date'])
df = df.dropna(subset=['customer_id', 'order_amount'])
# 3. 特征工程
df['year'] = df['order_date'].dt.year
df['month'] = df['order_date'].dt.month
df['weekday'] = df['order_date'].dt.day_name()
# 4. 分析:月度销售趋势
monthly = df.groupby(['year', 'month'])['order_amount'].sum()
monthly.plot(kind='line', figsize=(12, 6))
plt.title('月度销售趋势')
plt.show()
# 5. 分析:客户价值分层
customer_value = df.groupby('customer_id')['order_amount'].sum()
customer_value.describe()
# RFM分析
rfm = df.groupby('customer_id').agg({
'order_date': lambda x: (pd.Timestamp.now() - x.max()).days, # Recency
'order_id': 'count', # Frequency
'order_amount': 'sum' # Monetary
})
rfm.columns = ['recency', 'frequency', 'monetary']
# 6. 导出结果
rfm.to_csv('customer_rfm.csv')
学习资源推荐
| 资源 | 说明 | 链接 |
|---|---|---|
| 官方文档 | 最权威的参考 | pandas.pydata.org |
| 10 Minutes to Pandas | 快速入门 | 官方教程 |
| Pandas Cheat Sheet | 速查表 | pandas官网 |
| Kaggle Learn | 互动教程 | kaggle.com/learn |
结语
Pandas是数据科学的基石。掌握本文的内容,你已经可以处理大部分数据分析任务了。
下一步,建议:
- 多练习:用真实数据集实践
- 学NumPy:理解底层原理
- 学可视化:Matplotlib、Seaborn
- 学机器学习:Scikit-learn
数据分析的世界很广阔,Pandas只是起点。
有问题欢迎在评论区讨论!后续我会分享更多数据科学相关内容。