你每天花多少时间处理表格数据?
如果是用 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% 的场景。
建议的做法是:先跑一遍技巧一到三(数据概览 + 清洗),再根据分析目标选择后面的技巧。别一上来就追求复杂的分析,先把数据洗干净最重要。
你的数据清洗过程中遇到过什么坑?评论区聊聊。