如何为DataFrame新增key_name列,填入符合code行条件的列名?
给DataFrame新增'key_name'列的实现方法
我来帮你搞定这个需求,咱们一步步拆解来做:
首先明确核心规则:给现有DataFrame新增一列key_name,要求:
- 除
code行外,每行找同时满足两个条件的列:该行该列值为1,且code行对应列值也为1 - 找到符合条件的列就填入列名,找不到填
nan code行本身的key_name直接填nan
方法一:用apply逐行处理(直观易懂,适合小数据集)
假设你的DataFrame变量名为df,代码如下:
import pandas as pd # 第一步:提取code行中值为1的列的掩码(标记哪些列是有效候选) code_mask = df.loc['code'] == 1 # 第二步:定义处理每行的函数 def get_key_name(row): # 跳过code行,直接返回空值 if row.name == 'code': return pd.NA # 筛选当前行中满足条件的列名 matched_columns = row[(row == 1) & code_mask].index # 有匹配列就取最后一个(和你例子里行4的结果一致;要取第一个就换[0]) return matched_columns[-1] if len(matched_columns) > 0 else pd.NA # 第三步:新增key_name列 df['key_name'] = df.apply(get_key_name, axis=1)
方法二:向量化处理(效率更高,适合大数据集)
如果你的数据量较大,逐行处理会偏慢,推荐用向量化方法提升速度:
import pandas as pd # 提取code行的有效列掩码 code_mask = df.loc['code'] == 1 # 生成布尔矩阵,标记每个位置是否满足双条件 matches = (df == 1) & code_mask # 找到每行最后一个匹配的列名,无匹配则填NA df['key_name'] = matches.idxmax(axis=1).where(matches.any(axis=1), pd.NA) # 单独设置code行的key_name为NA df.loc['code', 'key_name'] = pd.NA
结果说明
运行代码后就能得到你期望的结果:
- 行1的Q111满足双条件,
key_name为Q111 - 行2的Q570、Q7891虽为1,但code行对应列是0,所以返回
nan - 行3的Info583按规则应该返回列名,你给出的期望结果是
nan可能是笔误,可根据实际需求调整逻辑 - 行4的Q111和Info583都满足条件,代码取最后一个,所以
key_name为Info583,和你的例子一致
内容的提问来源于stack exchange,提问作者Ouhla
相关产品推荐
相关产品推荐

