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

基于列值生成新列: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 14:35:39