你的数据准备好被分析了吗?
拿到一份数据,最难的往往不是建模,而是把数据变成"能用"的状态。
我整理了10个在工作中最高频使用的Pandas技巧。覆盖了从清洗到可视化的完整流程,每个都是可以直接复制的代码。
技巧1:一行代码处理缺失值
import pandas as pd
df = pd.read_csv('data.csv')
# 删除含缺失值的行
df_clean = df.dropna()
# 用列的中位数填充
df['age'] = df['age'].fillna(df['age'].median())
# 用'未知'填充字符串列
df['city'] = df['city'].fillna('未知')
# 向前填充(用上一行的值)
df.fillna(method='ffill', inplace=True)
场景:用户行为数据里,“城市"字段经常缺失。用中位数或众数填充比直接删除更合理——删除会丢掉大量样本。
技巧2:高效去重
# 按某几列去重
df_unique = df.drop_duplicates(subset=['user_id', 'date'])
# 只保留每组第一条
df_first = df.sort_values('timestamp').drop_duplicates(subset=['user_id'], keep='first')
# 统计去重前后对比
print(f'去重前: {len(df)}, 去重后: {len(df_unique)}')
场景:用户行为日志经常有重复事件。按user_id和date去重,可以快速找到唯一的每日用户记录。
技巧3:条件筛选的6种写法
# 1. 基础筛选
df[df['age'] > 18]
# 2. 多条件(用括号!)
df[(df['age'] > 18) & (df['city'] == '北京')]
# 3. 范围筛选
df[df['price'].between(100, 500)]
# 4. 字符串包含
df[df['name'].str.contains('手机', na=False)]
# 5. isin(匹配多个值)
df[df['status'].isin(['completed', 'pending'])]
# 6. query方法(代码更干净)
df.query("age > 18 and city == '北京'")
场景:筛选"已完成订单"的数据做分析,用isin比写多个==简洁得多。
技巧4:分组聚合的进阶用法
# 基础分组
df.groupby('category')['sales'].sum()
# 多列聚合
df.groupby('category').agg({
'sales': ['sum', 'mean', 'std'],
'quantity': 'mean'
})
# 分组后过滤(只保留销售额>10000的组)
df.groupby('category')['sales'].sum().query('> 10000')
# 分组排序后取top N
df.groupby('category')['sales'].apply(lambda x: x.nlargest(3).mean())
场景:电商数据分析,按类目聚合销量是基础操作。进阶用法可以让你一个命令出多列统计结果。
技巧5:时间序列处理
# 转换时间列
df['date'] = pd.to_datetime(df['date'])
df = df.set_index('date')
# 按周/月聚合
df['sales'].resample('W').sum()
df['sales'].resample('M').mean()
# 计算同比环比
df['sales'].pct_change(periods=7) # 同比(7天前)
df['sales'].pct_change(periods=1) # 环比(前一天)
# 滚动窗口(7天移动平均)
df['sales'].rolling(window=7).mean()
场景:业务数据通常有时间维度。用resample按天/周/月聚合,用rolling做趋势分析,是时间序列分析的基本功。
技巧6:合并多个DataFrame
# 基础merge
df_merged = pd.merge(df1, df2, on='user_id', how='left')
# 多个表连接
df_all = df1.merge(df2, on='id').merge(df3, on='id')
# 纵向拼接
df_all = pd.concat([df1, df2, df3], ignore_index=True)
# 带条件的合并
df_merged = pd.merge(df1, df2, on='user_id',
how='inner',
suffixes=('_old', '_new'))
场景:用户表、订单表、商品表通常需要合并。left merge保留所有用户,inner merge只保留有订单的用户。
技巧7:数据透视表
# 基础透视
pivot = df.pivot_table(
values='sales',
index='category',
columns='month',
aggfunc='sum'
)
# 带统计值的透视
pivot = df.pivot_table(
values='sales',
index='category',
columns='region',
aggfunc=['sum', 'mean', 'count']
)
# 透视后排序
pivot.sort_values('sum', ascending=False).head(10)
场景:分析"不同品类在不同月份的销售额”,透视表比手动分组快得多,结果也直观。
技巧8:自定义函数映射
# map(用于单列转换)
df['category'] = df['category'].map({1: '电子产品', 2: '服饰', 3: '食品'})
# apply(用于行级计算)
df['total'] = df.apply(lambda row: row['price'] * row['quantity'], axis=1)
# applymap(用于逐元素操作)
df = df.applymap(lambda x: x.strip() if isinstance(x, str) else x)
# pipe(链式操作)
df = (df
.pipe(lambda x: x[x['sales'] > 0])
.pipe(lambda x: x.assign(total=lambda r: r['price']*r['qty']))
.pipe(lambda x: x.sort_values('total', ascending=False))
)
场景:数据清洗的最后一步,通常需要对数据做统一处理。pipe让你把多个处理步骤链在一起,代码可读性大幅提升。
技巧9:快速数据探索
# 数据概览
df.info()
df.describe()
# 唯一值统计
df['category'].value_counts()
# 相关性分析
df.corr(numeric_only=True)
# 分组统计
df.groupby('category').agg({
'price': ['min', 'max', 'mean'],
'quantity': 'sum'
})
# 抽样查看
df.sample(5)
场景:拿到新数据的第一件事就是探索。这5行代码能在10秒内告诉你数据长什么样,有没有明显问题。
技巧10:导出和保存
# 导出CSV(不加索引)
df.to_csv('output.csv', index=False)
# 导出Excel(多sheet)
with pd.ExcelWriter('report.xlsx') as writer:
df1.to_excel(writer, sheet_name='用户', index=False)
df2.to_excel(writer, sheet_name='订单', index=False)
# 导出为JSON
df.to_json('data.json', orient='records', force_ascii=False)
# 导出为Parquet(压缩,适合大数据)
df.to_parquet('data.parquet', compression='snappy')
场景:分析完数据,导出是给同事或汇报的必要步骤。ExcelWriter一次性写多个sheet,比手动创建Excel快得多。
完整工作流示例
把上面的技巧串起来,一个典型的数据分析流程:
import pandas as pd
# 1. 读取数据
df = pd.read_csv('sales.csv')
# 2. 数据清洗
df['date'] = pd.to_datetime(df['date'])
df = df.dropna(subset=['amount'])
df = df[df['amount'] > 0]
# 3. 特征工程
df['month'] = df['date'].dt.month
df['day_of_week'] = df['date'].dt.day_name()
# 4. 分组聚合
result = df.groupby(['month', 'category'])['amount'].agg(['sum', 'mean', 'count']).reset_index()
# 5. 透视表
pivot = result.pivot_table(index='category', columns='month', values='sum', fill_value=0)
# 6. 导出
pivot.to_excel('monthly_sales_by_category.xlsx')
6步,从原始CSV到一份分类别月度销售额透视表。全流程不超过20行代码。
最后说一句
Pandas最强大的地方不是某个具体功能,而是组合能力。上面的10个技巧单独看都不复杂,但组合起来能解决90%的日常数据分析问题。
你平时用Pandas处理最多的场景是什么?是清洗、聚合还是可视化?在评论区聊聊,说不定能碰撞出新的用法。