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



我在python中的数据帧有问题。我的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', .. }

我需要检查列name1。。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'])

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

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

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

您可以使用mapstack分两步执行此操作,然后应用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

最新更新