基于值数据类型转置Pandas DataFrame的实现方法咨询
解决方法
核心思路是先用melt把宽表转成窄表,再根据值的类型拆分到对应列,最后补全ID列。
步骤1:导入库并构建输入DataFrame
import pandas as pd import numpy as np # 构建输入DataFrame A df_a = pd.DataFrame({ 'FIELD_A': [123123, 123124, 123144], 'FIELD_B': [8, 7, 99], 'FIELD_C': ['a', 'c', 'x'], 'FIELD_D': [23423, 6464, 234] })
步骤2:用melt转换为窄表
将FIELD_A作为标识列,把其他列转成FIELD_NAME(处理掉前缀)和value两列:
df_melted = df_a.melt(id_vars='FIELD_A', var_name='FIELD_NAME', value_name='value') # 移除FIELD_前缀,比如FIELD_B转为B df_melted['FIELD_NAME'] = df_melted['FIELD_NAME'].str.replace('FIELD_', '')
步骤3:按值类型拆分到对应列
判断每个值的类型,字符串类型放入FIELD_STR_VALUE,数值类型放入FIELD_NUM_VALUE:
def split_value(val): if isinstance(val, str): return pd.Series([val, np.nan]) else: return pd.Series([np.nan, val]) # 应用函数拆分列 df_melted[['FIELD_STR_VALUE', 'FIELD_NUM_VALUE']] = df_melted['value'].apply(split_value) # 删除中间过渡的value列 df_melted = df_melted.drop('value', axis=1)
步骤4:添加ID列并调整顺序
用cumcount生成自增ID,再调整列的顺序匹配目标格式:
df_melted['ID'] = df_melted.groupby('FIELD_A').cumcount() + 1 # 调整列顺序 df_b = df_melted[['ID', 'FIELD_A', 'FIELD_NAME', 'FIELD_STR_VALUE', 'FIELD_NUM_VALUE']] # 若需要将空值显示为空字符串,执行以下代码 df_b = df_b.fillna('')
运行后得到的df_b就是你需要的目标格式。
内容的提问来源于stack exchange,提问作者konichiwa
相关产品推荐
相关产品推荐

