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

使用pandas拆分多行并赋值:复制含多个1的行并仅保留单个1

pandas多列1拆分为单行单1实现方案

完整可运行代码

import pandas as pd

# 构造示例数据
df = pd.DataFrame({
    'Proxyid': [123, 456, 789],
    'A': [1, 1, 0],
    'B': [0, 1, 0],
    'C': [0, 1, 0],
    'D': [0, 1, 0]
})

# 定义需要处理的数值列
num_cols = ['A', 'B', 'C', 'D']

# 步骤1:将宽表转为长表,筛选出值为1的记录
df_long = df.melt(id_vars='Proxyid', value_vars=num_cols, var_name='col_name')
df_long = df_long[df_long['value'] == 1].reset_index(drop=True)

# 步骤2:将筛选后的长表转回宽表,每行仅保留一个1
split_df = pd.get_dummies(df_long['col_name'], dtype=int)
split_df.insert(0, 'Proxyid', df_long['Proxyid'])

# 步骤3:补充原数据中全为0的行
zero_rows = df[df[num_cols].sum(axis=1) == 0][['Proxyid'] + num_cols].copy()

# 步骤4:合并结果并按Proxyid排序
final_df = pd.concat([split_df, zero_rows], ignore_index=True).sort_values('Proxyid').reset_index(drop=True)

print(final_df)

代码说明

  • 先通过melt方法把A/B/C/D四列从宽格式转为长格式,方便筛选出所有值为1的位置
  • 用get_dummies将长表中每个1的位置重新转为宽表,自动实现每行仅保留一个1的需求
  • 单独筛选出四列全为0的行补充到结果中,避免全0数据丢失
  • 最后合并结果并排序,得到和预期完全一致的输出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 19:54:00