Skip to content

数据重塑

数据重塑是将数据从一种格式转换为另一种格式的操作,常见的是长宽格式转换。

宽格式转长格式

python
import pandas as pd

# 宽格式数据
df_wide = pd.DataFrame({
    '姓名': ['张三', '李四'],
    '语文': [90, 85],
    '数学': [95, 88],
    '英语': [88, 92]
})

print("宽格式:")
print(df_wide)

# 转为长格式
df_long = df_wide.melt(
    id_vars=['姓名'],
    value_vars=['语文', '数学', '英语'],
    var_name='科目',
    value_name='分数'
)

print("\n长格式:")
print(df_long)

长格式转宽格式

python
# 使用pivot转为宽格式
df_wide_back = df_long.pivot(
    index='姓名',
    columns='科目',
    values='分数'
)

print("转回宽格式:")
print(df_wide_back)

多层索引重塑

python
df = pd.DataFrame({
    '班级': ['A', 'A', 'B', 'B'],
    '性别': ['男', '女', '男', '女'],
    '数学': [90, 85, 88, 92],
    '英语': [88, 90, 85, 87]
})

# 设置多层索引后stack
df_indexed = df.set_index(['班级', '性别'])
df_stacked = df_indexed.stack()

print("Stack结果:")
print(df_stacked)

# unstack转回
df_unstacked = df_stacked.unstack()
print("\nUnstack结果:")
print(df_unstacked)

交叉表

python
df = pd.DataFrame({
    '班级': ['A', 'A', 'B', 'B', 'A', 'B'],
    '科目': ['数学', '英语', '数学', '英语', '数学', '英语'],
    '分数': [90, 85, 88, 92, 87, 90]
})

# 创建交叉表
cross_tab = df.pivot_table(
    values='分数',
    index='班级',
    columns='科目',
    aggfunc='mean'
)

print("交叉表:")
print(cross_tab)

数据透视

python
df = pd.DataFrame({
    '日期': ['周一', '周一', '周二', '周二'],
    '产品': ['A', 'B', 'A', 'B'],
    '销量': [100, 150, 120, 180]
})

# 透视表
pivot = df.pivot(index='日期', columns='产品', values='销量')
print("透视表:")
print(pivot)

处理重复值

python
df = pd.DataFrame({
    '姓名': ['张三', '张三', '李四'],
    '科目': ['数学', '数学', '英语'],
    '分数': [90, 95, 88]
})

# 有重复值时使用pivot_table
df_pivot = df.pivot_table(
    index='姓名',
    columns='科目',
    values='分数',
    aggfunc='mean'  # 对重复值取平均
)

print("处理重复值:")
print(df_pivot)

实际应用

python
# 销售数据重塑
sales_data = pd.DataFrame({
    '地区': ['北', '北', '南', '南'],
    '月份': ['一月', '二月', '一月', '二月'],
    '产品A': [100, 120, 80, 90],
    '产品B': [150, 180, 120, 140]
})

# 转为长格式进行分析
sales_long = sales_data.melt(
    id_vars=['地区', '月份'],
    value_vars=['产品A', '产品B'],
    var_name='产品',
    value_name='销量'
)

print("销售数据长格式:")
print(sales_long)

# 按产品汇总
product_summary = sales_long.groupby('产品')['销量'].sum()
print("\n产品销量汇总:")
print(product_summary)

数据重塑是数据整理的重要技能,可以根据分析需求灵活转换数据格式。