如何在Pandas中反转get_dummies编码,提取行中值为1的列名
解决Pandas宽表转长表:提取值为1的列名对应ID
嘿,我来帮你搞定这个Pandas数据格式转换的需求!你需要把每行中值为1的列名和对应的ID配对,生成一个长格式的DataFrame,下面是两种简单高效的实现方法:
方法一:使用melt函数(直观易懂)
melt是Pandas专门用来将宽表转为长表的工具,步骤清晰,适合新手理解:
- 首先构造原始DataFrame(还原你提供的数据源):
import pandas as pd # 构建原始数据 raw_data = { 'ID': [1002, 1003, 1004, 1005, 1006, 1007, 1000, 1009], '1': [0, 0, 1, 0, 0, 1, 0, 0], '2': [1, 0, 1, 0, 0, 0, 0, 0], '3': [0, 0, 0, 0, 0, 1, 0, 1], '4': [1, 0, 0, 0, 0, 0, 0, 0], '5': [0, 0, 0, 1, 0, 0, 0, 0], '6': [0, 0, 0, 0, 1, 0, 0, 0], '7': [0, 0, 0, 0, 0, 0, 0, 1], '8': [0, 0, 0, 0, 0, 0, 0, 0], '9': [0, 0, 0, 0, 0, 0, 0, 0] } df = pd.DataFrame(raw_data)
- 用
melt转换格式并过滤值为1的行:
# 将宽表转为长表,ID作为标识列,其他列转为变量和值 melted_df = df.melt(id_vars='ID', var_name='Col2', value_name='flag') # 只保留flag为1的行,删除多余的flag列并重置索引 final_df = melted_df[melted_df['flag'] == 1].drop('flag', axis=1).reset_index(drop=True)
方法二:使用stack函数(更简洁)
stack可以快速将列索引转为行索引,适合追求代码简洁的场景:
# 设置ID为索引,将其他列堆叠为行 stacked_df = df.set_index('ID').stack().reset_index() # 重命名列名,过滤值为1的行并整理格式 stacked_df.columns = ['ID', 'Col2', 'flag'] final_df = stacked_df[stacked_df['flag'] == 1].drop('flag', axis=1).reset_index(drop=True)
最终结果
运行上述代码后,final_df就会得到你想要的格式:
ID Col2 0 1002 2 1 1002 4 2 1004 1 3 1004 2 4 1005 5 5 1006 6 6 1007 1 7 1007 3 8 1009 3 9 1009 7
注意:原始数据中ID为1003和1000的行全是0,所以不会出现在最终结果里,完全符合你的示例要求。
内容的提问来源于stack exchange,提问作者MukundS
相关产品推荐
相关产品推荐

