如何在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:
| Info | Type | Number |
|---|---|---|
| a | Type 1 | 1.0 |
| b | Type 1 | 2.0 |
| b | Type 2 | 3.0 |
| c | Type 2 | 4.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
相关产品推荐
相关产品推荐

