本文目录导读:

我来详细讲解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) |
这些案例涵盖了数据变换的常见场景,可以根据实际需求灵活组合使用。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播