1. Pandas入门:为什么它是数据分析的瑞士军刀?
第一次接触Pandas时,我被它的功能震撼到了。这个看似简单的Python库,实际上包含了处理数据的各种利器。就像厨房里的多功能料理机,它能切片、能搅拌、能榨汁,而Pandas能读取数据、清洗数据、分析数据,最后还能漂亮地展示数据。
安装Pandas只需要一行命令,但它的威力可不小:
python复制pip install pandas
我建议新手从这两个核心数据结构开始:
- Series:像升级版的Python列表,每个元素都有标签
- DataFrame:想象成Excel表格的编程版本,但功能强大百倍
举个真实例子,上周我用Pandas处理了一份销售数据:
python复制import pandas as pd
# 读取CSV文件
sales_data = pd.read_csv('sales.csv')
# 查看前5行
print(sales_data.head())
就这么简单的几行代码,就能把杂乱的数据变成整齐的表格。Pandas最棒的地方在于,它让数据"活"了起来——你可以随意切片、筛选、计算,就像在玩数据积木。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据操作基本功:从零开始玩转DataFrame
2.1 创建和查看DataFrame的5种姿势
我见过很多新手被DataFrame的创建方式搞晕。其实就像做菜有不同的烹饪方法,DataFrame也有多种创建方式:
- 从字典创建(最常用):
python复制data = {'姓名': ['张三', '李四'], '年龄': [25, 30]}
df = pd.DataFrame(data)
- 从列表创建:
python复制data = [['张三', 25], ['李四', 30]]
df = pd.DataFrame(data, columns=['姓名', '年龄'])
- 从CSV文件读取(实战中最常见):
python复制df = pd.read_csv('data.csv')
- 从Excel导入:
python复制df = pd.read_excel('data.xlsx')
- 从数据库查询获取:
python复制import sqlite3
conn = sqlite3.connect('database.db')
df = pd.read_sql('SELECT * FROM users', conn)
查看数据时,我最常用的几个方法:
df.head()- 查看前5行df.tail()- 查看后5行df.sample(3)- 随机查看3行df.info()- 查看数据类型和内存使用df.describe()- 查看数值列的统计摘要
2.2 数据选取的十八般武艺
数据选取是Pandas的核心技能,我把它分为三个层次:
基础版 - 列选择:
python复制# 选择单列
names = df['姓名']
# 选择多列
subset = df[['姓名', '年龄']]
进阶版 - 行选择:
python复制# 按位置选择
first_row = df.iloc[0] # 第一行
# 按标签选择
row = df.loc[0] # 索引为0的行
# 切片选择
first_three = df.iloc[0:3]
高级版 - 条件筛选:
python复制# 简单条件
young_people = df[df['年龄'] < 30]
# 多条件组合
filtered = df[(df['年龄'] > 20) & (df['城市'] == '北京')]
# 使用query方法
result = df.query('年龄 > 25 and 收入 > 5000')
记住一个小技巧:.loc是基于标签的,.iloc是基于位置的,这个区别在实际工作中经常导致bug。
3. 数据清洗实战:从脏数据到干净数据的蜕变
3.1 处理缺失值的3种策略
真实世界的数据很少是完美的。我处理过的数据中,90%都有缺失值问题。下面是三种应对策略:
- 删除法 - 简单粗暴但有效:
python复制# 删除包含缺失值的行
df.dropna()
# 删除全为缺失值的列
df.dropna(axis=1, how='all')
- 填充法 - 更保守的选择:
python复制# 用固定值填充
df.fillna(0)
# 用前一个值填充
df.fillna(method='ffill')
# 用列的平均值填充
df['年龄'].fillna(df['年龄'].mean(), inplace=True)
- 插值法 - 适合有序数据:
python复制df['温度'].interpolate()
3.2 处理重复数据的完整流程
重复数据是另一个常见问题。我通常按照这个流程处理:
- 检测重复:
python复制df.duplicated() # 标记重复行
df.duplicated(subset=['姓名']) # 只检查姓名列
- 查看重复:
python复制df[df.duplicated(keep=False)] # 显示所有重复行
- 处理重复:
python复制# 删除完全重复的行
df.drop_duplicates()
# 保留特定列组合的唯一记录
df.drop_duplicates(subset=['姓名', '日期'])
3.3 数据类型转换和异常值处理
数据类型错误会导致各种奇怪的问题。这是我常用的转换方法:
python复制# 转换为数值
df['价格'] = pd.to_numeric(df['价格'], errors='coerce')
# 转换为日期
df['日期'] = pd.to_datetime(df['日期'])
# 转换为分类变量
df['城市'] = df['城市'].astype('category')
处理异常值时,我常用的两种方法:
python复制# 方法1:用分位数限制
upper_limit = df['收入'].quantile(0.99)
df['收入'] = df['收入'].clip(upper=upper_limit)
# 方法2:用标准差过滤
mean = df['年龄'].mean()
std = df['年龄'].std()
df = df[(df['年龄'] > mean - 3*std) & (df['年龄'] < mean + 3*std)]
4. 高级数据操作技巧:让数据处理效率翻倍
4.1 数据合并的三种方式
Pandas提供了三种主要的合并方法,各有适用场景:
- concat - 简单堆叠:
python复制# 垂直堆叠
pd.concat([df1, df2])
# 水平拼接
pd.concat([df1, df2], axis=1)
- merge - 类似SQL的JOIN:
python复制# 内连接
pd.merge(df1, df2, on='用户ID')
# 左连接
pd.merge(df1, df2, on='用户ID', how='left')
- join - 基于索引的合并:
python复制df1.join(df2, how='inner')
4.2 分组聚合的威力
分组聚合是数据分析的核心操作。Pandas的分组功能非常强大:
python复制# 基本分组
df.groupby('城市')['销售额'].sum()
# 多重分组
df.groupby(['城市', '月份']).agg({
'销售额': ['sum', 'mean'],
'利润': 'max'
})
# 使用自定义聚合函数
def top_3(series):
return series.nlargest(3).tolist()
df.groupby('城市')['销售额'].apply(top_3)
4.3 时间序列处理的实用技巧
Pandas对时间序列的支持非常完善:
python复制# 设置日期索引
df.set_index('日期', inplace=True)
# 按周重采样
weekly_sales = df['销售额'].resample('W').sum()
# 计算移动平均
df['7天平均'] = df['销售额'].rolling(window=7).mean()
# 时间差计算
df['间隔天数'] = (df['结束日期'] - df['开始日期']).dt.days
5. 实战案例:电商数据分析全流程
让我们用一个完整的电商数据分析案例,把前面学的知识串起来:
5.1 数据加载和初步探索
python复制# 加载数据
orders = pd.read_csv('orders.csv')
users = pd.read_excel('users.xlsx')
# 查看数据结构
print(orders.info())
print(users.describe())
# 合并数据
merged = pd.merge(orders, users, on='user_id')
5.2 数据清洗和准备
python复制# 处理缺失值
merged['payment_method'].fillna('未知', inplace=True)
# 转换数据类型
merged['order_date'] = pd.to_datetime(merged['order_date'])
# 删除测试数据
merged = merged[merged['amount'] > 0]
5.3 数据分析和洞察
python复制# 计算每月销售额
monthly_sales = merged.set_index('order_date').resample('M')['amount'].sum()
# 用户分层分析
user_segments = merged.groupby('user_id').agg({
'amount': ['sum', 'count'],
'age': 'mean'
})
# 热门商品分析
top_products = merged['product_id'].value_counts().head(10)
5.4 结果可视化
python复制import matplotlib.pyplot as plt
# 绘制月度销售趋势
monthly_sales.plot(figsize=(10, 5), title='月度销售额趋势')
plt.show()
# 绘制用户年龄分布
merged['age'].plot.hist(bins=20, alpha=0.7)
plt.xlabel('年龄')
plt.title('用户年龄分布')
plt.show()
这个案例展示了Pandas在实际工作中的完整应用流程。从原始数据到有价值的洞察,Pandas提供了全套工具。记住,数据处理不是目的,而是手段,最终目标是从数据中发现有价值的信息。
