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

2024-09-27 00:22:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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', .. }

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

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


Tags: nonedfnpwhereplname1isinmatched
2条回答

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

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

相关问题 更多 >

    热门问题