使用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
相关产品推荐
相关产品推荐

