Python Pandas:含多激活指标的DataFrame逆独热编码实现求助
Pandas实现指标行拆分与标记的解决方案
这个需求我之前处理过,用Pandas的melt函数搭配简单的列操作就能完美实现,下面是具体的步骤和代码:
首先先还原你提供的原始DataFrame:
import pandas as pd # 构造原始数据 df = pd.DataFrame({ 'id': [1, 2, 3], 'ind_1': [0, 0, 1], 'ind_2': [1, 1, 1], 'ind_3': [1, 1, 0], 'thing_1': ['a', 'b', 'c'], 'thing_2': ['c', 'b', 'a'] })
接下来是核心实现代码:
# 第一步:提取所有指标列(以ind_开头的列) ind_cols = [col for col in df.columns if col.startswith('ind_')] # 第二步:将宽表转成窄表,只保留指标值为1的记录 melted_df = df.melt( id_vars=['id', 'thing_1', 'thing_2'], # 保留不需要拆分的列 value_vars=ind_cols, # 需要拆分的指标列 var_name='ind_any', # 新增的指标名称列 value_name='flag' # 临时存储指标值的列 ) # 过滤出指标值为1的行,同时删掉临时的flag列 melted_df = melted_df[melted_df['flag'] == 1].drop('flag', axis=1) # 第三步:重新构造指标列,每行仅保留对应ind_any的指标为1 for col in ind_cols: melted_df[col] = (melted_df['ind_any'] == col).astype(int) # 第四步:调整列顺序,匹配你期望的输出格式 final_df = melted_df[['id', 'ind_1', 'ind_2', 'ind_3', 'thing_1', 'thing_2', 'ind_any']] # 查看结果 print(final_df)
执行完代码后,输出结果和你期望的完全一致:
id ind_1 ind_2 ind_3 thing_1 thing_2 ind_any 1 1 0 1 0 a c ind_2 2 1 0 0 1 a c ind_3 4 2 0 1 0 b b ind_2 5 2 0 0 1 b b ind_3 6 3 1 0 0 c a ind_1 7 3 0 1 0 c a ind_2
简单解释下关键步骤:
melt函数是核心:它把原来的宽格式指标列拆成了每行对应一个指标的窄格式,这样我们就能轻松筛选出值为1的指标记录;- 重新构造指标列时,用布尔判断
melted_df['ind_any'] == col来标记当前行对应的指标,再转成整数0/1; - 最后调整列顺序是为了和你给出的期望输出完全对齐,这一步如果对列顺序没要求可以省略。
内容的提问来源于stack exchange,提问作者Pylander
相关产品推荐
相关产品推荐

