Pandas Dataframe转置优化:动态生成In/Out列避免冗余
解决方法
核心思路
要实现按Job Number分组,将时间戳两两配对成In/Out列且避免冗余列,关键是先对每组内的时间戳做有序分组,再将每组时间戳拆分为成对的In/Out,最后统一列名。
步骤与代码
确保时间戳顺序正确
先按Job Number和Timestamp排序,保证每组内的时间戳按先后顺序排列:import pandas as pd # 假设原始DataFrame为df df = df.sort_values(['Job Number', 'Timestamp'])分组拆分时间戳为In/Out对
定义函数,将每组的时间戳列表拆分为两两一组的In/Out,数量为奇数时补空值保证成对:def reshape_timestamps(group): ts_list = group['Timestamp'].tolist() # 时间戳数量为奇数时补空值 if len(ts_list) % 2 != 0: ts_list.append(None) # 拆分成In/Out对并展开为一维序列 paired_ts = [] for i in range(0, len(ts_list), 2): paired_ts.extend([ts_list[i], ts_list[i+1]]) return pd.Series(paired_ts)生成目标DataFrame并命名列
应用上述函数到每个分组,转置为宽表后,将列名设置为交替的In/Out:# 分组处理并转置为宽表 df2 = df.groupby('Job Number').apply(reshape_timestamps).unstack().reset_index() # 重命名列:首列为Job Number,后续交替为In/Out total_cols = df2.shape[1] - 1 df2.columns = ['Job Number'] + ['In' if idx % 2 == 0 else 'Out' for idx in range(total_cols)]
原有方法冗余列的原因
你之前用Timestamp作为pivot的列名,会生成与原始数据中所有唯一时间戳数量一致的列,而非按每组实际需求生成。上面的方法基于每组内的时间戳数量动态生成对应In/Out列,空值自动填充,不会产生冗余。
内容的提问来源于stack exchange,提问作者Clare
相关产品推荐
相关产品推荐

