🏠 首页 攻略 Pandas 数据处理 10 个实战技巧:从清洗到分析一步到位

Pandas 数据处理 10 个实战技巧:从清洗到分析一步到位

告别手动 Excel 处理!本文整理 Pandas 数据处理 10 个高频实用技巧,含代码示例。数据清洗、缺失值处理、分组聚合全都有,适合数据分析入门和进阶。

你每天花多少时间处理表格数据?

如果是用 Excel 手动筛选、复制粘贴、写公式——那这篇文章能帮你省下至少一半的时间。

我用 Python 的 Pandas 库处理数据已经三年了。今天把最实用的 10 个技巧整理出来,每个都附带可直接运行的代码。

技巧一:快速查看数据概览

打开一个 CSV 文件,第一件事不是急着分析,而是看看数据长什么样。

import pandas as pd

df = pd.read_csv('sales_data.csv')

# 前5行
print(df.head())

# 基本信息:行数、列数、数据类型
print(df.info())

# 统计摘要:均值、标准差、分位数
print(df.describe())

# 检查缺失值
print(df.isnull().sum())

info() 告诉你每列的数据类型和空值数量。describe() 给出数值列的统计信息。这两步能让你 30 秒内对数据质量有个判断。

技巧二:智能处理缺失值

缺失值处理方式取决于数据特性。

# 数值型:用中位数填充(比均值更抗异常值)
df['age'].fillna(df['age'].median(), inplace=True)

# 分类变量:用众数填充
df['city'].fillna(df['city'].mode()[0], inplace=True)

# 时间序列:向前填充
df['value'].fillna(method='ffill', inplace=True)

# 直接删除整行都是空的记录
df.dropna(subset=['email'], inplace=True)

关键原则:不要盲目删除缺失值。如果某列 80% 的数据都有值,删除会导致样本偏差。填充往往比删除更安全。

技巧三:高效数据去重

# 完全重复的行
df.drop_duplicates(inplace=True)

# 按指定列去重,保留第一条
df.drop_duplicates(subset=['user_id'], keep='first', inplace=True)

# 按指定列去重,保留最后一条
df.drop_duplicates(subset=['user_id'], keep='last', inplace=True)

去重前先用 df.duplicated().sum() 统计一下有多少重复行,做到心中有数。

技巧四:批量数据清洗

# 去除字符串首尾空格
df['name'] = df['name'].str.strip()

# 统一邮箱格式为小写
df['email'] = df['email'].str.lower()

# 日期格式转换
df['order_date'] = pd.to_datetime(df['order_date'], format='%Y/%m/%d')

# 提取手机号中的数字
df['phone'] = df['phone'].str.extract(r'(\d{11})')

这些操作可以链式调用,一行搞定:

df['email'] = df['email'].str.strip().str.lower()

技巧五:条件筛选和布尔索引

# 多条件筛选
high_value_orders = df[(df['amount'] > 1000) & (df['status'] == 'completed')]

# 使用 query 方法(可读性更好)
high_value_orders = df.query('amount > 1000 and status == "completed"')

# 范围查询
recent_orders = df[df['order_date'].between('2026-01-01', '2026-07-01')]

# 包含/不包含
premium_users = df[df['city'].isin(['北京', '上海', '深圳'])]

query() 方法特别适合复杂条件,写起来像 SQL,直观好读。

技巧六:数据分组聚合

# 按城市统计销售额
city_sales = df.groupby('city')['amount'].sum().sort_values(ascending=False)

# 多维度分组
monthly_city = df.groupby([df['order_date'].dt.to_period('M'), 'city']).agg(
    total_amount=('amount', 'sum'),
    order_count=('order_id', 'count'),
    avg_amount=('amount', 'mean')
)

groupby 是 Pandas 最强大的功能之一。配合 agg() 可以同时计算多个统计指标,一次遍历完成所有聚合。

技巧七:数据透视表

# 类似 Excel 的透视表
pivot = pd.pivot_table(
    df,
    values='amount',
    index='city',
    columns=df['order_date'].dt.month,
    aggfunc=['sum', 'count', 'mean'],
    fill_value=0
)

透视表能快速实现交叉分析。比如看每个城市每个月的订单量和平均金额,一眼就能发现异常月份。

技巧八:合并多张表

# 左连接:保留左表所有行
merged = pd.merge(df_orders, df_users, on='user_id', how='left')

# 多表连接
merged = pd.merge(merged, df_products, on='product_id', how='left')

# 纵向拼接(上下合并)
combined = pd.concat([df_2025_q1, df_2025_q2, df_2025_q3])

实际项目中经常遇到数据分散在多个文件的情况。用 merge 和 concat 把它们拼在一起,后续分析就方便多了。

技巧九:创建衍生字段

# 计算订单金额与平均值的偏差
df['amount_deviation'] = df['amount'] - df['amount'].mean()

# 标记高价值用户
df['is_premium'] = df['total_spend'] > df['total_spend'].quantile(0.8)

# 按时间段分桶
df['hour_bucket'] = pd.cut(df['order_hour'], bins=[0, 6, 12, 18, 24],
                           labels=['凌晨', '上午', '下午', '晚上'])

衍生字段能让数据更有分析价值。比如标记出 top 20% 的高价值用户,后续可以直接用这个字段做分层分析。

技巧十:导出数据和可视化

# 导出清洗后的数据
df.to_csv('cleaned_sales_data.csv', index=False)

# 导出 Excel(支持多 sheet)
with pd.ExcelWriter('report.xlsx') as writer:
    df.groupby('city').head(10).to_excel(writer, sheet_name='Top10')
    df.describe().to_excel(writer, sheet_name='Summary')

# 简单可视化
df['amount'].hist(bins=50)
df.groupby('city')['amount'].sum().plot(kind='bar')

处理完的数据直接导出,或者生成简单的图表放在报告里。Pandas 内置的 matplotlib 接口足够应付日常需求。

完整示例:从原始数据到分析报告

把所有技巧串起来,一个典型的数据处理流程:

import pandas as pd

# 1. 读取数据
df = pd.read_csv('raw_sales.csv')

# 2. 数据清洗
df['email'] = df['email'].str.strip().str.lower()
df['order_date'] = pd.to_datetime(df['order_date'])
df.dropna(subset=['email'], inplace=True)

# 3. 去重
df.drop_duplicates(subset=['order_id'], inplace=True)

# 4. 衍生字段
df['month'] = df['order_date'].dt.to_period('M')
df['is_high_value'] = df['amount'] > df['amount'].median()

# 5. 分组分析
analysis = df.groupby('month').agg(
    total_revenue=('amount', 'sum'),
    order_count=('order_id', 'count'),
    avg_order=('amount', 'mean')
).reset_index()

# 6. 导出结果
analysis.to_csv('monthly_report.csv', index=False)

不到 20 行代码,完成了从原始数据到月度分析报告的全流程。

写在最后

Pandas 的功能远不止这些。但上面这 10 个技巧覆盖了日常数据分析 80% 的场景。

建议的做法是:先跑一遍技巧一到三(数据概览 + 清洗),再根据分析目标选择后面的技巧。别一上来就追求复杂的分析,先把数据洗干净最重要。

你的数据清洗过程中遇到过什么坑?评论区聊聊。