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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:50:21