Pandas DataFrame如何查找每行首个值为1的位置并新增列
需求说明
现有如下Pandas数据集:
import pandas as pd df = pd.DataFrame({ 'id':['id1', 'id2', 'id3'], 'cmp1':[1,0,0], 'cmp2':[0,1,0], 'cmp3':[1,0,0]})
需要新增col列,逐行标记cmp1/cmp2/cmp3三列中值为1首次出现的位置,规则如下:
- 首个1出现在
cmp1:标记为first - 首个1出现在
cmp2:标记为second - 首个1出现在
cmp3:标记为third - 三列无1:标记为
none
期望输出效果:
df2 = pd.DataFrame({ 'id':['id1', 'id2', 'id3'], 'cmp1':[1,0,0], 'cmp2':[0,1,0], 'cmp3':[1,0,0], 'col':['first', 'second','none']})
实现代码
直接用Pandas内置向量化方法实现,无需逐行循环,运行效率高:
# 指定要判断的列顺序 target_cols = ['cmp1', 'cmp2', 'cmp3'] # 列名到输出值的映射关系 label_map = { 'cmp1': 'first', 'cmp2': 'second', 'cmp3': 'third' } # 计算col列 df['col'] = ( df[target_cols] .idxmax(axis=1) # 逐行返回最大值(即1)第一次出现的列名 .map(label_map) # 将列名替换为对应标记文本 .where(df[target_cols].any(axis=1), 'none') # 全0行填充为none )
结果验证
执行代码后打印df,得到的输出和预期完全一致:
id cmp1 cmp2 cmp3 col 0 id1 1 0 1 first 1 id2 0 1 0 second 2 id3 0 0 0 none
逻辑说明:
idxmax(axis=1)本身会返回行内最大值首次出现的列索引,由于判断列的值只有0和1,最大值就是1,刚好匹配"找首个1位置"的需求;最后通过any(axis=1)判断行内是否存在1,过滤掉全0的特殊情况填充none即可。如果后续需要扩展更多判断列,只需要修改target_cols列表和对应label_map映射规则即可。
内容的提问来源于stack exchange,提问作者jay
相关产品推荐
相关产品推荐

