如何用Python从DataFrame提取非零值并生成含表头与值的列
从DataFrame提取非零值并生成表头-值对应列的Python实现
需求说明
从DataFrame中提取所有非零值,将表头名称与对应值分别放入单独列中(和你提供的Excel公式效果一致)。
示例输入与输出
输入DataFrame
import pandas as pd df = pd.DataFrame({ 'ID': [1, 2], 'A': [0, 2], 'B': [5, 0], 'C': [0, 7], 'D': [3, 0] })
期望输出
| ID | Header | Value |
|---|---|---|
| 1 | B | 5 |
| 1 | D | 3 |
| 2 | A | 2 |
| 2 | C | 7 |
实现方案
方法1:使用stack()(推荐,简洁高效)
# 将ID设为索引,堆叠其他列 stacked_df = df.set_index('ID').stack().reset_index() # 过滤非零值并重命名列 result = stacked_df[stacked_df[0] != 0].rename(columns={'level_1': 'Header', 0: 'Value'}) # 重置索引(可选,让结果更整洁) result = result.reset_index(drop=True) print(result)
方法2:使用melt()
如果更习惯宽表转长表的melt操作,也可以用以下方式:
# 宽表转长表,指定ID为标识列 melted_df = df.melt(id_vars='ID', var_name='Header', value_name='Value') # 过滤非零值 result = melted_df[melted_df['Value'] != 0].reset_index(drop=True) print(result)
代码解释
stack():将DataFrame的列转为行,自动保留索引(这里是ID),生成包含索引、表头、值的三级结构melt():将指定的标识列(id_vars)保留,其余列统一转为"变量-值"对格式- 两种方法最终都通过过滤
Value != 0得到非零值结果,再调整列名和索引让输出符合预期格式
内容的提问来源于stack exchange,提问作者adamekcerv
相关产品推荐
相关产品推荐

