Pandas DataFrame部分列重组与重命名优化方案问询
Pandas DataFrame重组并自定义列名
问题描述
原始DataFrame如下:
col1 col2 A B C D E F timestamp 2022-05-09 11:28:00 -12 -11 15 45 NaN NaN 3.0 100 2022-05-09 11:28:01 -8 -7 5.0 20 3.0 25 NaN NaN 2022-05-09 11:28:02 -9 -8 NaN NaN 5.0 35 15 20 2022-05-09 11:28:03 -12 -7 NaN NaN 7.0 30 NaN NaN
需要依据A、C、E列的值重组DataFrame,已通过以下代码实现基础重组效果:
out = pd.lreshape( df.reset_index(), {'cols': ['A', 'C', 'E'], 'values': ['B', 'D', 'F']} ).pivot('timestamp', 'cols', 'values')
基础重组结果:
col1 col2 3.0 5.0 7.0 15.0 timestamp 2022-05-09 11:28:00 -12 -11 100 NaN NaN 45 2022-05-09 11:28:01 -8 -7 25 20 NaN NaN 2022-05-09 11:28:02 -9 -8 NaN 35 NaN 20 2022-05-09 11:28:03 -12 -7 NaN NaN 30 NaN
现在需要将新列名改为A_3.0、A_5.0这类格式,最终期望结果:
col1 col2 A_3.0 A_5.0 A_7.0 A_15.0 timestamp 2022-05-09 11:28:00 -12 -11 100 NaN NaN 45 2022-05-09 11:28:01 -8 -7 25 20 NaN NaN 2022-05-09 11:28:02 -9 -8 NaN 35 NaN 20 2022-05-09 11:28:03 -12 -7 NaN NaN 30 NaN
寻求更简便的实现方法。
解决方案
方法1:基于现有代码修改列名
在原代码基础上直接给pivot后的列名添加前缀,再合并回原始的col1、col2列:
# 执行原重塑逻辑 out = pd.lreshape( df.reset_index(), {'cols': ['A', 'C', 'E'], 'values': ['B', 'D', 'F']} ).pivot('timestamp', 'cols', 'values') # 给列名添加A_前缀 out.columns = [f'A_{col}' for col in out.columns] # 合并col1、col2并调整列顺序 out = out.join(df[['col1', 'col2']]) out = out[['col1', 'col2'] + [col for col in out.columns if col not in ['col1', 'col2']]]
方法2:链式写法简化流程
把列名修改、合并列等操作整合为链式调用,更简洁:
out = (pd.lreshape(df.reset_index(), {'cols': ['A','C','E'], 'values': ['B','D','F']}) .pivot('timestamp', 'cols', 'values') .rename(columns=lambda x: f'A_{x}') .join(df[['col1', 'col2']]) .reindex(columns=['col1', 'col2'] + [col for col in out.columns if col.startswith('A_')]))
方法3:用melt替代lreshape(更直观)
通过melt明确映射原列关系,再完成pivot和列名修改:
# 定义A/C_E与对应值列的映射 col_map = {'A':'B', 'C':'D', 'E':'F'} # 重塑数据 melted = df.reset_index().melt( id_vars=['timestamp', 'col1', 'col2'], value_vars=['A', 'C', 'E'], var_name='source', value_name='key' ) # 匹配对应的值 melted['value'] = melted.apply(lambda row: row[col_map[row['source']]], axis=1) # 生成结果 out = melted.pivot(index='timestamp', columns='key', values='value') out.columns = [f'A_{col}' for col in out.columns] out = out.join(df[['col1', 'col2']]) out = out[['col1', 'col2'] + list(out.columns[:-2])]
内容的提问来源于stack exchange,提问作者EngGu
相关产品推荐
相关产品推荐

