Python 检查df中的列是否包含特定集合,如果为true,则指定值

Python 检查df中的列是否包含特定集合,如果为true,则指定值,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,我对python中的dataframe有一个问题。我的df看起来像这样: type object name1 name2 name3 name4 name5 name6 PL Y NAM1 NAM2 NAM3 None None None PL Z NamY NAMZ NAMI MAMJ NAMY NamT PL Z

我对python中的dataframe有一个问题。我的df看起来像这样:

type      object    name1   name2   name3   name4   name5   name6
PL          Y        NAM1   NAM2    NAM3    None    None    None
PL          Z        NamY   NAMZ    NAMI    MAMJ    NAMY    NamT
PL          Z        NamW   NAMG    NAMO    MAMR    NAMV    NamL
{'NAM1', 'MAMJ', .. }
设置如下:

type      object    name1   name2   name3   name4   name5   name6
PL          Y        NAM1   NAM2    NAM3    None    None    None
PL          Z        NamY   NAMZ    NAMI    MAMJ    NAMY    NamT
PL          Z        NamW   NAMG    NAMO    MAMR    NAMV    NamL
{'NAM1', 'MAMJ', .. }
我需要检查列名称1中是否有。。name6是第二个集合中的值,如果是,则必须将该值分配到新列中

我可以用numpy做到这一点,但在很多方面:

df['matched'] = np.where(df['name1'].isin(set1), df['name1'], '')
df['matched'] = np.where(df['name2'].isin(set1), df['name2'], df['matched'])
df['matched'] = np.where(df['name3'].isin(set1), df['name3'], df['matched'])
df['matched'] = np.where(df['name4'].isin(set1), df['name4'], df['matched'])
df['matched'] = np.where(df['name5'].isin(set1), df['name5'], df['matched'])
df['matched'] = np.where(df['name6'].isin(set1), df['name6'], df['matched'])

我怎样才能在一行中做到这一点?谢谢你的提示

您可以使用
map
stack
分两步执行此操作,并应用
groupby
获得最大索引位置值:

myset = {'NAM1', 'MAMJ'}

s = df.filter(like='name').stack()
s1 = s[s.isin(myset)].groupby(level=[0]).last()

print(s1)
0    NAM1
1    MAMJ
dtype: object
然后映射到数据帧上:

df['matched'] = df.index.map(s1) # add .fillna('') if you want to replace blanks with whitespace.

print(df)
    
  type object name1 name2 name3 name4 name5 name6 matched
0   PL      Y  NAM1  NAM2  NAM3  None  None  None    NAM1
1   PL      Z  NamY  NAMZ  NAM1  MAMJ  NAMY  NamT    MAMJ
2   PL      Z  NamW  NAMG  NAMO  MAMR  NAMV  NamL     NaN

如果不想替换集合1中的所有匹配项,可以使用以下代码:

df = df.assign(
    matched = lambda x: x.apply(lambda s: set(s).intersection(set1),axis=1)
)

对于第2行必须是MAMJwith,我得到了一个错误TypeError:(“'set'对象不可调用,'occurrent at index 13580')我想您在代码中的某个时候使用set作为变量名。这就是为什么它现在是一个物体。我知道,但可能在那之前。如果你可以重置你的笔记本并且不再使用它,它将被修复。你能再次检查它吗?我试过使用简单的数据集(3行),看起来还可以,但是我的大量数据导致了这个错误。。也许是有数据的东西。。但是numpy正在工作。如果没有赋值,它就不工作,列匹配的值在其中不是空的case@JJ36请添加一个示例。在我的问题中,我已将第三行添加到df中-在第三行的s1中运行后,我有NAMG,但它不在myset中。