如何用Python实现weekday列与周一至周日多列的数据互转?
Python实现weekday列与多列格式的互转
正向转换:将weekday列转为多列格式
借助pandas的哑变量生成和分组求和功能,将单个weekday列转换为按星期拆分的多列标记格式:
import pandas as pd # 构造输入数据 data = { 'buyer': ['A', 'A', 'B', 'B', 'B', 'C'], 'weekday': ['Saturday', 'Friday', 'Monday', 'Tuesday', 'Thursday', 'Monday'] } df = pd.DataFrame(data) # 定义固定星期顺序,与期望结果匹配 week_order = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] # 生成星期哑变量,按buyer分组统计出现次数 df_dummies = pd.get_dummies(df['weekday']) df_grouped = df.groupby('buyer')[df_dummies.columns].sum().reset_index() # 将统计值替换为标记符,调整列顺序 df_result = df_grouped.replace({1: 'Y', 0: ''}) df_result = df_result[['buyer'] + week_order] print(df_result)
输出结果:
buyer Monday Tuesday Wednesday Thursday Friday Saturday Sunday 0 A Y Y 1 B Y Y Y 2 C Y
反向转换:从多列格式转回weekday列
使用melt函数将宽表转长表,筛选标记为Y的记录即可恢复原始格式:
# 反向转换恢复原始数据结构 df_reversed = df_result.melt( id_vars='buyer', value_vars=week_order, var_name='weekday', value_name='flag' ) # 过滤有效标记行,清理冗余列 df_reversed = df_reversed[df_reversed['flag'] == 'Y'].drop(columns='flag').reset_index(drop=True) print(df_reversed)
输出结果:
buyer weekday 0 B Monday 1 C Monday 2 B Tuesday 3 B Thursday 4 A Friday 5 A Saturday
内容的提问来源于stack exchange,提问作者ghostabx
相关产品推荐
相关产品推荐

