IF else 和 for 循环在一行

IF else and for loop in one line

我需要在单个 line.I 中应用 if else 条件和 for 循环需要同时更新 'RL' 和 "RM" 并将其他值更新为 'Others' .怎么办??.可以吗??

train['MSZoning']=['RL' if x=='RL' else 'Others' for x in train['MSZoning']]

使用numpy.where:

train['MSZoning'] = np.where(train['MSZoning'] == 'RM', 'RM', 'Others')

如果需要在没有 RMRL 的情况下全部更新,请使用 isin 和反向布尔掩码 ~:

train = pd.DataFrame({'MSZoning':['RL'] *3 + ['qa','RM','as']})
train.loc[~train['MSZoning'].isin(['RM','RL']), 'MSZoning'] =  'Others'

print (train)
  MSZoning
0       RL
1       RL
2       RL
3   Others
4       RM
5   Others

时间:

train = pd.DataFrame({'MSZoning':['RL'] *3 + ['qa','RM','as']})
#[60000 rows x 1 columns]
train = pd.concat([train] * 10000, ignore_index=True)

In [202]: %timeit train.loc[~train['MSZoning'].isin(['RM','RL']), 'MSZoning'] =  'Others'
5.82 ms ± 447 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [203]: %timeit train['MSZoning'] = train['MSZoning'].apply(lambda x: x if x in ('RM', 'RL') else 'Others')
15 ms ± 584 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

因此,如果您想保留 RMRL,同时将其他标记为 Others,您可以使用:

train['MSZoning'] = train['MSZoning'].apply(lambda x: x if x in ('RM', 'RL') else 'Others')