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

Pandas DataFrame按指定列值重构的方法咨询

解决DataFrame按指定列重构的问题

嘿,这个需求其实不用手动分组提取唯一值,用pandas的**重塑(reshape)**组合操作就能轻松搞定,比手动处理高效多了。咱们先理清楚逻辑:你需要把A→B、C→D、E→F这三组「键-值」对整合,然后以所有唯一的键作为新列,按时间戳对齐对应的值。

第一步:构造原始数据

先把你给出的DataFrame用代码还原出来:

import pandas as pd
import numpy as np

df = pd.DataFrame(
    {
        'A': [15, 5.0, np.nan, np.nan],
        'B': [45, 20, np.nan, np.nan],
        'C': [np.nan, 3.0, 5.0, 7.0],
        'D': [np.nan, 25, 35, 30],
        'E': [3.0, np.nan, 15, np.nan],
        'F': [100, np.nan, 20, np.nan]
    },
    index=pd.to_datetime([
        '2022-05-09 11:28:00',
        '2022-05-09 11:28:01',
        '2022-05-09 11:28:02',
        '2022-05-09 11:28:03'
    ])
)

第二步:整合键值对

我们把A-B、C-D、E-F这三组分别转成统一的「key-value」格式,再合并到一起:

# 分别处理三组,重命名列并去掉空的key值
group_a = df[['A', 'B']].rename(columns={'A': 'key', 'B': 'value'}).dropna(subset=['key'])
group_c = df[['C', 'D']].rename(columns={'C': 'key', 'D': 'value'}).dropna(subset=['key'])
group_e = df[['E', 'F']].rename(columns={'E': 'key', 'F': 'value'}).dropna(subset=['key'])

# 合并三组数据
merged_kv = pd.concat([group_a, group_c, group_e])

第三步:重塑成目标格式

用pivot_table把窄表转回宽表,自动提取所有唯一的key作为新列:

# 重塑,按时间戳索引,key作为列,value填充对应位置
result = merged_kv.pivot_table(
    index=merged_kv.index,
    columns='key',
    values='value',
    aggfunc='first'  # 若同一时间戳+key有多个值,取第一个,可按需修改为sum/mean等
)

# 按你期望的列顺序排序(3.0,5.0,7.0,15.0)
result = result[[3.0, 5.0, 7.0, 15.0]]

最终结果

运行后得到的result就是你想要的格式:

key                 3.0   5.0   7.0   15.0
2022-05-09 11:28:00  100.0  NaN   NaN   45.0
2022-05-09 11:28:01   25.0  20.0  NaN   NaN
2022-05-09 11:28:02    NaN  35.0  NaN   20.0
2022-05-09 11:28:03    NaN   NaN  30.0  NaN

为什么这个方法更简便?

  • 不用手动去遍历提取A/C/E的唯一值,pivot_table会自动识别所有有效key
  • 全程用pandas的向量化操作,比循环分组效率高得多
  • 逻辑清晰:先统一键值格式,再重新排列,后续修改需求(比如新增键值对组)也更容易扩展

内容的提问来源于stack exchange,提问作者EngGu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 20:27:34