我有一个数据框:
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',我不知道为什么。
答案 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)