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

如何用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]
})

期望输出

IDHeaderValue
1B5
1D3
2A2
2C7

实现方案

方法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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 04:36:13