🏠 首页 攻略 Python Pandas数据处理10个必会技巧

Python Pandas数据处理10个必会技巧

Pandas是数据分析必备工具。本文精选10个高频场景的实战技巧,从数据清洗到可视化的完整工作流,每个技巧都附可运行代码,直接复制就能用。

你的数据准备好被分析了吗?

拿到一份数据,最难的往往不是建模,而是把数据变成"能用"的状态。

我整理了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_iddate去重,可以快速找到唯一的每日用户记录。


技巧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处理最多的场景是什么?是清洗、聚合还是可视化?在评论区聊聊,说不定能碰撞出新的用法。