Python 检查df中的列是否包含特定集合,如果为true,则指定值
我对python中的dataframe有一个问题。我的df看起来像这样: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
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中。