Pandas如何为每行生成值为Y的对应列名组成的列表新列
实现方案
方案1:易读的行遍历方案(适合小体量数据)
核心代码通过apply按行处理实现,逻辑直观好理解:
df['col6'] = df.apply(lambda row: [col for col in df.columns if row[col] == 'Y'], axis=1)
逻辑说明:指定axis=1逐行遍历,对每行依次判断所有列的取值是否为Y,符合条件的列名直接存入列表,赋值给新列即可。
方案2:向量化高性能方案(适合十万行以上的大体量数据)
避免apply的Python级循环开销,用Pandas原生矩阵运算实现,性能提升明显:
# 生成值为Y的布尔掩码矩阵 mask = df.eq('Y') # 矩阵点乘列名拼接后拆分得到列表 df['col6'] = mask.dot(mask.columns + ',').str.rstrip(',').str.split(',')
效果验证示例
你可以用以下代码构造示例数据测试效果:
import pandas as pd # 构造和你示例一致的DataFrame df = pd.DataFrame({ 'col1': ['Y', 'Y', 'N'], 'col2': ['N', 'N', 'N'], 'col3': ['N', 'Y', 'Y'], 'col4': ['N', 'Y', 'N'], 'col5': ['Y', 'Y', 'N'] }, index=['a', 'b', 'c']) # 执行方案1 df['col6'] = df.apply(lambda row: [col for col in df.columns if row[col] == 'Y'], axis=1) print(df)
运行后输出和你预期的结果完全一致。
内容的提问来源于stack exchange,提问作者user14380579
相关产品推荐
相关产品推荐

