You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas Dataframe转置优化:动态生成In/Out列避免冗余

解决方法

核心思路

要实现按Job Number分组,将时间戳两两配对成In/Out列且避免冗余列,关键是先对每组内的时间戳做有序分组,再将每组时间戳拆分为成对的In/Out,最后统一列名。

步骤与代码

  1. 确保时间戳顺序正确
    先按Job Number和Timestamp排序,保证每组内的时间戳按先后顺序排列:

    import pandas as pd
    
    # 假设原始DataFrame为df
    df = df.sort_values(['Job Number', 'Timestamp'])
    
  2. 分组拆分时间戳为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)
    
  3. 生成目标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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 16:57:41