Python Pandas,检查连续某些列的条件?

时间:2017-05-05 14:23:12

标签: 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  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'<​​/ p>

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',我不知道为什么。

2 个答案:

答案 0 :(得分:1)

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

df['small'] = pd.np.where(df.eq('Y').any(1), 'N', 'Y')

df
#    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

答案 1 :(得分:1)

你快到了。但每次你将文字'var1','var2'...传递给is_small时,这就是它总是返回'Y'的原因。您应该通过row['var1']row['var2'] ....

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