如何将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
相关产品推荐
相关产品推荐

