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

基于DataFrame列、索引与原值转换数据失败,求正确实现方案

DataFrame值替换为带索引和列名的自定义文本

现有如下DataFrame:

MX AX3 AX5  AX7 AX7L
Feature                                               
ADAS-Lane Departure Warning       No  No  No  Yes  Yes
ADAS - Adaptive Cruise Control**  No  No  No  Yes  Yes
ADAS - High Beam Assist           No  No  No  Yes  Yes
ADAS - Traffic Sign Recognition   No  No  No  Yes  Yes
360 Surround View System          No  No  No   No  Yes

需要将单元格值按规则替换:

  • 值为No时,替换为 {对应行索引} is not present in {对应列名}
  • 值为Yes时,替换为 {对应行索引} is present in {对应列名}

你尝试的代码未达到预期效果:

def convert_value(value, index, column):
    if value == 'Yes':
        return f'{index} is present in {column} variant'
    else:
        return f'{index} is not present in {column} variant'

df = df.applymap(lambda x: convert_value(x, df.index, df.columns))

问题根源

applymap仅能传递单元格的值,无法直接获取该单元格对应的行索引和列名。你的代码中传入的df.index和df.columns是整个索引/列对象,而非当前单元格对应的行、列标识,因此输出不符合预期。


可行解决方案

方案1:按行遍历处理

利用apply(axis=1)遍历每一行,通过row.name获取当前行的索引(Feature名称),再对每个列值进行替换:

def process_row(row):
    feature_name = row.name
    return row.apply(lambda val, col: f"{feature_name} is present in {col}" if val == 'Yes' else f"{feature_name} is not present in {col}", args=(row.index,))

df = df.apply(process_row, axis=1)

方案2:堆叠重塑后处理

通过stack()将DataFrame转为多层索引Series,直接获取每个元素对应的行和列信息,处理后再转回DataFrame:

# 堆叠为(Feature, Variant)的多层索引Series
stacked_df = df.stack()

# 批量替换值
stacked_df = stacked_df.apply(lambda x: f"{stacked_df.index.get_level_values(0)[0]} is present in {stacked_df.index.get_level_values(1)[0]}" if x == 'Yes' else f"{stacked_df.index.get_level_values(0)[0]} is not present in {stacked_df.index.get_level_values(1)[0]}")

# 转回原DataFrame结构
df = stacked_df.unstack()

方案3:向量化广播操作(高效简洁)

借助numpy广播生成索引和列名的矩阵,再用np.where批量替换:

import numpy as np

# 生成广播矩阵:行索引为二维数组,列名为一维数组
features = df.index.values[:, np.newaxis]
variants = df.columns.values

# 批量替换并重构DataFrame
df = pd.DataFrame(
    np.where(df == 'Yes',
             f"{features} is present in {variants}",
             f"{features} is not present in {variants}"),
    index=df.index,
    columns=df.columns
)

执行任意方案后,即可得到符合需求的结果,例如第一行AX7列会变为ADAS-Lane Departure Warning is present in AX7。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 13:35:40