You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检查DataFrame多列是否含指定值并生成列名与值的新列列表?

Pandas生成匹配值列的解决方案

需求说明:
检查DataFrame指定列(cols)中是否存在列表lst内的值,生成两个新列:

  • result:存储匹配的列名(现有代码已实现)
  • result1:存储对应匹配的值(当前仅能得到布尔值,需解决)

示例数据:

import pandas as pd
import numpy as np

df = pd.DataFrame({'id':[np.nan,2,3,4,5,6],
                  'column1':[np.nan,10,15,20,25,25],
                  'column2':[np.nan,4,6,8,10,np.nan],
                   'column3':[np.nan,6,9,12,np.nan,15],
                  'column4':[np.nan,np.nan,np.nan,np.nan,np.nan,np.nan]})

lst = ['4','6','10','25']
cols = ['column1','column2','column3','column4']

现有生成result列的代码:

m1  = df[cols].isin(lst)
m2 = pd.DataFrame((~m1.any(1)).to_numpy()[:, None] &  df[cols].eq(2).to_numpy(),
                   index=m1.index, columns=m1.columns)
    
m = (m1 | m2)
    
df['result'] = m.where(m).stack().reset_index().groupby('level_0')['level_1'].agg(list)

解决方法:生成result1列

在原有逻辑基础上,通过保留匹配位置的实际值,再分组聚合即可得到对应值的列表:

# 生成result1列(对应值列表)
matched_values = df[cols].where(m)
df['result1'] = matched_values.stack().reset_index().groupby('level_0')[0].agg(list)

# 处理无匹配的行,填充为空列表
df[['result', 'result1']] = df[['result', 'result1']].fillna('[]').applymap(eval)

结果说明

执行后df会新增两个列:

  • result:每行存储匹配到的列名列表,如第2行(index=1)为['column1', 'column2', 'column3']
  • result1:每行存储对应匹配到的值列表,如第2行为[10, 4, 6]

内容的提问来源于stack exchange,提问作者Sam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 16:15:34