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

Python Pandas如何基于多列值批量生成条件标记新列?

问题描述

给定数据集:

import pandas as pd

data = {'col1': ['a','b','a','c'], 'col2': [None,None,'a',None], 'col3': [None,'a',None,'b'], 'col4': ['a',None,'b',None], 'col5': ['b','c','c',None]}
df = pd.DataFrame(data)

需求:基于col1至col4的唯一值生成新列,当col1/col2/col3/col4中任意一列的值等于新列列名时,标记为1,否则为0。期望输出:

data = {'col1': ['a','b','a','c'], 'col2': [None,None,'a',None], 'col3': [None,'a',None,'b'], 'col4': ['a',None,'b',None], 'col5': ['b','c','c',None], 'a':[1,1,1,0],'b':[0,1,1,1],'c':[0,1,1,1]}
df = pd.DataFrame(data)

当前仅能通过重复单列操作实现:

df['a'] = 0
df['a'] = (df['col1'] == 'a').astype(int)

需要批量完成该操作的方法。

批量解决方案

方法1:利用pd.get_dummies+分组取最大值

通过独热编码生成各列的标记,再按值分组取行最大值(只要任意一列匹配就保留1),最后合并回原数据框:

# 提取目标列子集
subset = df[['col1', 'col2', 'col3', 'col4']]
# 生成独热编码并按值分组取行最大值
dummies = pd.get_dummies(subset).groupby(lambda col_name: col_name.split('_')[-1], axis=1).max()
# 合并到原数据框
df = pd.concat([df, dummies], axis=1)

方法2:遍历唯一值+apply检查存在性

先提取目标列的所有唯一值(排除None),再遍历每个值生成对应标记列:

# 获取col1-col4的非空唯一值
unique_vals = df[['col1', 'col2', 'col3', 'col4']].stack().unique().tolist()
unique_vals = [val for val in unique_vals if val is not None]

# 批量生成新列
for val in unique_vals:
    df[val] = df[['col1', 'col2', 'col3', 'col4']].apply(lambda row: val in row.values, axis=1).astype(int)

方法3:向量化运算(高效适合大数据集)

用numpy的向量化操作替代apply,提升运算效率:

import numpy as np

# 将目标列转为numpy数组
subset_arr = df[['col1', 'col2', 'col3', 'col4']].to_numpy()
# 获取非空唯一值
unique_vals = df[['col1', 'col2', 'col3', 'col4']].stack().unique()
unique_vals = unique_vals[unique_vals != np.array(None)]

# 批量生成新列
for val in unique_vals:
    df[val] = np.isin(subset_arr, val).any(axis=1).astype(int)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 07:35:27