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

如何在Pandas中提取DataFrame列信息并合并列重构数据?

解决方案:用pd.melt()重构你的DataFrame

嘿,这个需求其实就是典型的宽表转长表场景,Pandas里有个专门的函数能完美适配——pd.melt(),我给你一步步拆解怎么实现:

首先先还原你的示例数据:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'Number Type 1':[1,2,np.nan], 
    'Number Type 2':[np.nan,3,4], 
    'Info':list('abc')
})

我们的目标是把Number Type 1和Number Type 2这两列“融化”成两列:一列存类型标识(Type),一列存对应的数值(Number),同时保留Info列的对应关系,并且自动过滤掉空值。

核心实现代码

# 使用melt函数完成宽转长
melted_df = df.melt(
    id_vars=['Info'],  # 指定要保留的关联列,这里是Info
    value_vars=['Number Type 1', 'Number Type 2'],  # 需要转换的目标列
    var_name='Type',  # 新生成的类型列的名称
    value_name='Number'  # 新生成的数值列的名称
).dropna(subset=['Number'])  # 过滤掉数值为空的行

# 可选优化:把Type列的名称简化(去掉"Number "前缀)
melted_df['Type'] = melted_df['Type'].str.replace('Number ', '')

最终结果

运行后你会得到这样的DataFrame:

InfoTypeNumber
aType 11.0
bType 12.0
bType 23.0
cType 24.0

完全符合你的需求:数值合并到了Number列,类型信息提取到了Type列,Info和每个数值都正确绑定(比如b同时对应Type1的2和Type2的3)。

为什么推荐pd.melt()?

  • 这是Pandas专门为宽表转长表设计的工具,参数语义清晰,可读性极强,新手也能快速理解
  • 可以直接通过参数定义新列的名称,不用额外做列名修改
  • 配合dropna()能轻松过滤无效空值,一步到位

备选方法:用stack()实现

如果你更喜欢链式操作的风格,也可以用stack()来完成:

stacked_df = df.set_index('Info')\
               .stack()\
               .reset_index(name='Number')\
               .rename(columns={'level_1':'Type'})
stacked_df['Type'] = stacked_df['Type'].str.replace('Number ', '')

这个方法的逻辑是先把Info设为索引,再把列堆叠成行,最后重置索引并调整列名,结果和上面完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:08:09