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

