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
相关产品推荐
相关产品推荐

