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

