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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 14:24:52