Python 请检查行中某些列的条件?

Python 请检查行中某些列的条件?,python,pandas,Python,Pandas,我有一个数据帧: var1 var2 var3 var4 Id# 1001 Y Y Y Y 1002 N N N N 1003 N N Y N 1003 Y Y Y N 我想创建一个名为Small的新列,其中如果任何var=Y,那么Small等于N var1 var2 var3 va

我有一个数据帧:

      var1  var2  var3  var4
Id#                         
1001     Y     Y     Y     Y
1002     N     N     N     N
1003     N     N     Y     N
1003     Y     Y     Y     N
我想创建一个名为Small的新列,其中如果任何var=Y,那么Small等于N

      var1  var2  var3  var4  Small
Id#                         
1001     Y     Y     Y     Y      N       
1002     N     N     N     N      Y 
1003     N     N     Y     N      N
1003     Y     Y     Y     N      N
我尝试过的解决方案: 我创建了一个名为is_small的函数,当一行中有一列是“Y”时,该函数会翻转到“N”

def is_small(row, *cols):
    _small = 'Y'
    for col in cols:
        if col == 'Y':
            _small = 'N'
    return _small
并将其应用于我的数据集:

all_data['Small'] = all_data.apply(lambda row: is_small(row,
                                                        'var1',
                                                        'var2',
                                                        'var3',
                                                        'var4'),
                                   axis=1)

无论多么小,都返回为“Y”,我不知道为什么。

您可以使用
numpy.where
(矢量化的if/else):


你就快到了。但每次你通过文字“var1”,“var2”。。。into
很小,这就是它总是返回“Y”的原因。您应该传递
行['var1']
行['var2']

all_data['Small'] = all_data.apply(lambda row: is_small(row,
    row['var1'],
    row['var2'],
    row['var3'],
    row['var4']),
axis=1)

除了var1、var2、var3、var4之外,我还有其他可能有Y/N响应的列。如果是这种情况,您可以在构建布尔条件之前手动选择这四列
pd.np.where(df[['var1','var2','var3','var4']].eq('Y').any(1),'N','Y')
所以我所做的是向我的函数传递*args
['var1','var2','var3','var4']
all_data['Small'] = all_data.apply(lambda row: is_small(row,
    row['var1'],
    row['var2'],
    row['var3'],
    row['var4']),
axis=1)