Python案例如何用Pandas做数据变换

wen python案例 1

本文目录导读:

Python案例如何用Pandas做数据变换

  1. 基础环境准备
  2. 数据清洗变换
  3. 数据类型变换
  4. 数值变换
  5. 分类数据变换
  6. 聚合变换
  7. 字符串变换
  8. 高级变换技巧
  9. 时间序列变换
  10. 综合案例:销售数据变换
  11. 常用变换函数快速参考

我来详细讲解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)

这些案例涵盖了数据变换的常见场景,可以根据实际需求灵活组合使用。

抱歉,评论功能暂时关闭!