基于列值生成新列:Pandas DataFrame匹配填充1值的通用解法问题
基于指定列生成匹配值新列的解决方案
初始数据与需求
初始DataFrame代码:
import numpy as np import pandas as pd data = {'Name':['Karan','Rohit','Sahil','Aryan'],'Age':[23,22,21,23]} df = pd.DataFrame(data)
需求:基于指定列(示例为Age)的唯一值创建新列,当新列列名与该行对应列的值匹配时填充1,否则填充None,期望输出:
Name Age 21 22 23 0 Karan 23 None None 1 1 Rohit 22 None 1 None 2 Sahil 21 1 None None 3 Aryan 23 None None 1
原代码问题分析
你尝试的代码能创建对应列,但值填充错误,核心问题:
- 循环变量
i与列表推导中的变量重名,导致匹配逻辑混乱 - 引用列名时用了小写
"age",但原DataFrame列名为大写"Age" - 先赋值
None再被列表推导覆盖,属于冗余操作
通用解决方案
方法1:修正循环逻辑(易理解)
def data_categorical_check(df, column_cat): # 获取目标列的唯一值并转为字符串作为新列名 unique_vals = df[column_cat].unique().astype(str) # 遍历每个唯一值生成对应列 for val_str in unique_vals: # 匹配时填1,否则填None df[val_str] = df[column_cat].apply(lambda x: 1 if str(x) == val_str else None) return df
调用示例:
result_df = data_categorical_check(df, 'Age') print(result_df)
方法2:用get_dummies高效实现(适合大数据量)
利用pandas内置的哑变量生成函数,无需手动循环,效率更高:
def data_categorical_check(df, column_cat): # 生成哑变量,去掉前缀 dummies = pd.get_dummies(df[column_cat], prefix='', prefix_sep='').astype(object) # 将0替换为None dummies[dummies == 0] = None # 合并原数据与新生成的列 return pd.concat([df, dummies], axis=1)
两种方法都支持通过column_cat参数指定任意目标列,输出结果均符合需求。
内容的提问来源于stack exchange,提问作者onhalu
相关产品推荐
相关产品推荐

