如何基于指定条件对Pandas DataFrame执行Melt变形操作
Pandas 按指定列映射取值转换长表实现方法
核心逻辑是逐行读取UsefulCol字段的值,取该行对应列的数值作为Value,保留原表timestamp、ID字段,将UsefulCol重命名为Col即可,以下是三种不同场景的实现方案:
方案1:lookup 方法(适合低版本pandas,性能最优)
import pandas as pd from numpy import nan # 构造示例DataFrame df = pd.DataFrame({'timestamp': ['16/11/2021', '17/11/2021', '17/11/2021', '17/11/2021'], 'ID': [1, 1, 2, 3], 'Col1': [0.2, 0.3, nan, nan], 'Col2': [nan, nan, 10.0, nan], 'Col3': [0.1, 0.8, nan, 0.1], 'Col4': [nan, nan, nan, 2.0], 'UsefulCol': ['Col3', 'Col3', 'Col2', 'Col4']}) # 核心转换逻辑 res = pd.DataFrame({ 'timestamp': df['timestamp'], 'ID': df['ID'], 'Col': df['UsefulCol'], 'Value': df.lookup(df.index, df['UsefulCol']) })
方案2:apply 方法(适合小数据量,写法最简单)
res = df[['timestamp', 'ID', 'UsefulCol']].rename(columns={'UsefulCol': 'Col'}).assign( Value=df.apply(lambda row: row[row['UsefulCol']], axis=1) )
方案3:melt 关联过滤方法(适合大数据量,兼容全版本pandas)
# 先将所有Col列转为长表 melted_df = df.melt(id_vars=['timestamp', 'ID', 'UsefulCol'], var_name='Col', value_name='Value') # 过滤出UsefulCol和Col匹配的行即可 res = melted_df[melted_df['UsefulCol'] == melted_df['Col']].drop(columns='UsefulCol').reset_index(drop=True)
内容的提问来源于stack exchange,提问作者ML learner
相关产品推荐
相关产品推荐

