如何将pandas DataFrame中含delta的多行数据转换为对应列?
实现方法(Pandas环境,高效向量化操作)
以下方案无需循环,全用Pandas原生函数实现,百万行级数据也能秒级处理:
实现思路
你的数据是典型的「交替存储的配对行」结构:同一个ID下,dayN行后紧跟对应的delta行,我们只需要把两类行拆分后按配对关系合并即可。
具体代码
import pandas as pd # 1、预处理:标记行类型 df = mydata_frame.copy() df['is_delta'] = df['days'].str.contains('delta') # 提取所有特征列名,后续自动加前缀无需手动指定 f_cols = [col for col in df.columns if col.startswith('f')] # --- 关联方式1:按行顺序配对(要求原表同ID下的行严格按day、delta交替排序) # 每个ID下每两行一组,生成配对ID df['pair_id'] = df.groupby('IDs').cumcount() // 2 # 拆分主表(day行)和delta表 main_df = df[~df['is_delta']].drop(columns=['is_delta']) delta_df = df[df['is_delta']].drop(columns=['is_delta', 'days']) # 给delta表的特征列加del_前缀 delta_df = delta_df.rename(columns={c: f'del_{c}' for c in f_cols}) # 合并得到结果 res = pd.merge(main_df, delta_df, on=['IDs', 'pair_id'], how='left').drop(columns='pair_id') # --- 关联方式2:从delta行的字段提取关联的day(不受行顺序影响,只要delta命名符合delta_dayX&dayY格式) # 提取delta行对应的目标day(比如delta_day1&day2提取出day2作为关联键) # df.loc[df['is_delta'], 'days'] = df.loc[df['is_delta'], 'days'].str.extract(r'&(day\d+)')[0] # 拆分后直接按IDs和days合并 # main_df = df[~df['is_delta']] # delta_df = df[df['is_delta']].rename(columns={c: f'del_{c}' for c in f_cols}) # res = pd.merge(main_df, delta_df, on=['IDs', 'days'], how='left').drop(columns='is_delta') # 最后按ID和day排序规整格式 res = res.sort_values(['IDs', 'days']).reset_index(drop=True)
验证说明
两种方式都能得到你需要的输出结构,特征列f1~fn会自动和对应的del_f1~del_fn一一匹配,不需要手动指定每个特征的对应关系,不管你有多少个f列都能自动处理。
内容的提问来源于stack exchange,提问作者jeny ericsoon
相关产品推荐
相关产品推荐

