如何检查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
相关产品推荐
相关产品推荐

