DataFrame使用lookup生成新列及限定查询列的技术问题
解决DataFrame根据指定列值匹配对应列名的问题
首先,你遇到的问题核心是根据Final列的数值,在Alpha、Bravo、Charlie这三列中找到该数值所属的列名,而且需要排除其他无关列的干扰。之前用df.lookup(df.index, df.Final)没成功,是因为lookup方法需要传入的是列名而非列值,方向完全搞反啦。
下面给你几个精准可行的方案:
方法一:用布尔匹配+idxmax高效实现
这个方法逻辑清晰,而且严格限定了查询范围在目标列内,数据量大时效率也不错:
# 先明确要查询的目标列范围 target_cols = ['Alpha', 'Bravo', 'Charlie'] # 生成布尔矩阵,判断每行中目标列的值是否等于Final列的值 match_matrix = df[target_cols].eq(df['Final'], axis=0) # 找到每行中第一个匹配的列名,赋值给NewColumn df['NewColumn'] = match_matrix.idxmax(axis=1)
方法二:用apply逐行遍历(适合小数据集)
如果你的数据量不大,这个方法更直观,容易理解基础逻辑:
target_cols = ['Alpha', 'Bravo', 'Charlie'] def get_matching_col(row): # 遍历目标列,找到值等于Final的列名 for col in target_cols: if row[col] == row['Final']: return col return None # 可选:处理没有匹配值的异常情况 df['NewColumn'] = df.apply(get_matching_col, axis=1)
为什么之前的lookup方法失效?
你之前写的df.lookup(df.index, df.Final)是把Final列的数值(比如30、25)当成列名去查找,但你的列名是Alpha/Bravo/Charlie这类字符串,两者不匹配,自然得不到正确结果。如果一定要用lookup,需要先把数值映射成对应列名,反而绕了弯路,不如上面两种方法直接。
用你的示例数据测试后,两种方法都能得到你想要的结果:
Alpha Bravo Charlie Final NewColumn 0 10 20 30 30 Charlie 1 15 25 35 25 Bravo
内容的提问来源于stack exchange,提问作者J Ng
相关产品推荐
相关产品推荐

