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

如何将pandas DataFrame指定列转换为对应值的存在性指示列

解决方案

问题原因

现有代码执行melt时没有保留原始DataFrame的行索引,导致后续pivot_table是全局统计值出现次数,而非按原行逐行判断值是否存在,同时没有补全1到N之间缺失的列。

正确实现代码

import pandas as pd

# 示例数据
df = pd.DataFrame({
    "A": {0: 1, 1: 10, 2: 12},
    "B": {0: 7, 1: 6, 2: 3},
    "C": {0: 11, 1: 4, 2: 1},
    "D": {0: 6, 1: 5, 2: 4},
})

# 方法1:基于原有写法调整
N = df.max().max() # 取所有元素的最大值作为N
result = (
    df.reset_index(names="row_id") # 保留原始行号作为分组依据
    .melt(id_vars="row_id")
    .assign(val=1)
    .pivot_table(index="row_id", columns="value", values="val", fill_value=0)
    .reindex(range(1, N+1), axis=1, fill_value=0) # 补全1到N所有列
    .rename_axis(index=None, columns=None) # 可选:去掉索引和列的名称前缀
)
# 方法2:更简洁的写法
N = df.max().max()
result = (
    pd.get_dummies(df.stack(), prefix="", prefix_sep="")
    .groupby(level=0)
    .max()
    .reindex(range(1, N+1), axis=1, fill_value=0)
)

输出说明

输出结果的每一行对应原DataFrame的第i行,每列j的取值为1时代表原第i行存在值j,取值为0时代表不存在,列范围自动覆盖1到N的所有整数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:00:00