本文目录导读:

我来详细讲解Pandas做数据变换的常见方法,包含丰富的案例:
基础环境准备
import pandas as pd
import numpy as np
# 创建示例数据
df = pd.DataFrame({
'姓名': ['张三', '李四', '王五', '赵六', '张三'],
'年龄': [25, 30, 28, np.nan, 25],
'城市': ['北京', '上海', '广州', '北京', '广州'],
'销售额': [15000, 23000, 18000, 20000, 16000],
'部门': ['销售A部', '销售B部', '销售A部', '销售B部', '销售A部']
})
print("原始数据:")
print(df)
数据清洗变换
1 处理缺失值
# 填充缺失值
df['年龄'].fillna(df['年龄'].mean(), inplace=True) # 用均值填充
print("填充后的数据:")
print(df)
2 删除重复值
# 删除重复行
df_unique = df.drop_duplicates(subset=['姓名']) # 基于姓名列去重
print("去重后的数据:")
print(df_unique)
数据类型变换
# 数据类型转换
df['年龄'] = df['年龄'].astype(int) # 转为整数
df['销售额'] = df['销售额'].astype(float) # 转为浮点数
print("数据类型:")
print(df.dtypes)
数值变换
1 数学运算
# 创建新列
df['奖金'] = df['销售额'] * 0.1 # 计算奖金
df['调整销售额'] = df['销售额'] * 1.2 # 销售额上浮20%
print("数值变换后:")
print(df[['姓名', '销售额', '奖金', '调整销售额']])
2 标准化处理
# Min-Max标准化
df['销售额_标准化'] = (df['销售额'] - df['销售额'].min()) / (df['销售额'].max() - df['销售额'].min())
# Z-score标准化
df['销售额_zscore'] = (df['销售额'] - df['销售额'].mean()) / df['销售额'].std()
print("标准化结果:")
print(df[['姓名', '销售额', '销售额_标准化', '销售额_zscore']])
分类数据变换
1 标签编码
# 标签编码
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['城市_编码'] = le.fit_transform(df['城市'])
print("标签编码:")
print(df[['姓名', '城市', '城市_编码']])
2 One-Hot编码
# One-Hot编码
df_onehot = pd.get_dummies(df, columns=['城市'], prefix='城市')
print("One-Hot编码:")
print(df_onehot.columns.tolist())
print(df_onehot)
聚合变换
# 分组聚合
grouped = df.groupby('部门').agg({
'销售额': ['sum', 'mean', 'max'],
'年龄': 'mean'
}).round(2)
print("分组聚合结果:")
print(grouped)
# 数据透视表
pivot = pd.pivot_table(df,
values='销售额',
index='部门',
columns='城市',
aggfunc='sum',
fill_value=0)
print("\n数据透视表:")
print(pivot)
字符串变换
# 字符串操作
df['姓名_小写'] = df['姓名'].str.lower()
df['部门_简称'] = df['部门'].str.replace('销售', '销')
df['姓名_长度'] = df['姓名'].str.len()
print("字符串变换:")
print(df[['姓名', '姓名_小写', '部门', '部门_简称', '姓名_长度']])
高级变换技巧
1 条件变换
# 使用apply函数
df['销售额等级'] = df['销售额'].apply(
lambda x: '高' if x > 20000 else ('中' if x > 17000 else '低')
)
# 多条件变换
conditions = [
(df['销售额'] > 20000),
(df['销售额'] > 17000),
(df['销售额'] <= 17000)
]
choices = ['A级', 'B级', 'C级']
df['销售等级'] = np.select(conditions, choices, default='未知')
print("条件变换:")
print(df[['姓名', '销售额', '销售额等级', '销售等级']])
2 映射变换
# 使用映射字典
city_map = {'北京': '华北', '上海': '华东', '广州': '华南'}
df['区域'] = df['城市'].map(city_map)
# 值替换
age_map = {25: '年轻', 28: '成年', 30: '壮年'}
df['年龄分组'] = df['年龄'].map(age_map).fillna('其他')
print("映射变换:")
print(df[['姓名', '年龄', '城市', '区域', '年龄分组']])
时间序列变换
# 创建时间数据
dates = pd.date_range('2024-01-01', periods=5, freq='D')
df['日期'] = dates
df['月份'] = df['日期'].dt.month
df['星期'] = df['日期'].dt.day_name()
print("时间变换:")
print(df[['姓名', '日期', '月份', '星期']])
综合案例:销售数据变换
# 综合案例
def sales_transformation(df):
"""销售数据变换函数"""
# 1. 清除异常值
df = df[df['销售额'] > 0]
# 2. 缺失值填充
df['年龄'].fillna(df['年龄'].median(), inplace=True)
# 3. 创建派生指标
df['销售额_log'] = np.log1p(df['销售额']) # 对数变换
df['销售额_分类'] = pd.cut(df['销售额'],
bins=[0, 10000, 20000, 50000],
labels=['低', '中', '高'])
# 4. 排名变换
df['销售额排名'] = df['销售额'].rank(ascending=False)
# 5. 百分比变换
df['销售占比'] = df['销售额'] / df.groupby('部门')['销售额'].transform('sum')
return df
result = sales_transformation(df.copy())
print("综合变换结果:")
print(result[['姓名', '部门', '销售额', '销售额_log', '销售额分类', '销售占比']])
常用变换函数快速参考
| 函数 | 用途 | 示例 |
|---|---|---|
apply() |
应用自定义函数 | df['col'].apply(lambda x: x*2) |
map() |
值映射 | df['col'].map({'a':1, 'b':2}) |
replace() |
值替换 | df.replace({'old':'new'}) |
transform() |
组内变换 | df.groupby('col')['val'].transform('mean') |
cut() |
离散化 | pd.cut(df['col'], bins=3) |
qcut() |
分位数分箱 | pd.qcut(df['col'], q=4) |
这些案例涵盖了数据变换的常见场景,可以根据实际需求灵活组合使用。