悠悠楠杉
网站页面
正文:
在数据分析中,我们常遇到这样的困境:业务系统导出的Excel表格列宽到需要横向滚动十几次,而统计工具却要求"一维化"的数据格式。这时就需要将宽表(Wide Format)转为长表(Long Format),而Pandas的melt函数正是解决这个问题的瑞士军刀。
假设有一张包含用户ID和多个订单属性的宽表:
import pandas as pd
wide_df = pd.DataFrame({
'user_id': [101, 102],
'order_2023Q1': [2, 1],
'order_2023Q2': [3, 0],
'avg_amount': [150, 200]
})
要将季度订单列转为"时间段-订单数"的长格式,只需:
long_df = pd.melt(
wide_df,
id_vars=['user_id', 'avg_amount'], # 保留的固定列
value_vars=['order_2023Q1', 'order_2023Q2'], # 要转换的列
var_name='quarter', # 新列名(存储原列名)
value_name='order_count' # 新列名(存储原值)
)
转换后,数据会变成更利于聚合的纵向结构,每个用户的每季度订单成为独立行。
当处理包含多日UV数据的宽表时:
melted_logs = pd.melt(
log_data,
id_vars=['user_id', 'device_type'],
value_vars=['day1_click', 'day2_click', 'day3_click'],
var_name='day',
value_name='click_count'
).assign(
day=lambda x: x['day'].str.extract(r'day(\d+)') # 提取纯数字
)
通过链式操作,我们同时完成了列名清洗,让后续的时间序列分析更加顺畅。
value_vars中的列数据类型相同,混合数值和文本会导致意外转换wide_df.iloc[:, 0:100]分段操作pivot_table比pivot更安全,支持重复值处理通过这三个典型案例可以看到,melt的本质是将列标题转化为观测值,这正是Tidy Data原则的核心。当你的数据需要喂入Seaborn做可视化,或者准备用SQL做多层聚合时,这种"瘦高"的长表结构会成为最理想的输入格式。