我正在使用if在条件语句中,如下面的代码。如果地址是NJ,那么name列的值将更改为“N / A”。
df1.loc[df1.Address.isin(['NJ']), 'name'] = 'N/A'
如果我有'嵌套if语句',如何做同样的事情?
# this not code just representing the logic
if address isin ('NJ', 'NY'):
if name1 isin ('john', 'bob'):
name1 = 'N/A'
if name2 isin ('mayer', 'dylan'):
name2 = 'N/A'
我可以使用df.loc
实现上述逻辑吗?或者还有其他方法吗?
答案 0 :(得分:2)
使用单独的作业。您可以使用不同的条件进行过滤,可以将address
和两个name*
过滤器与&
结合使用(但在每个测试周围加上括号):
df1.loc[(df1.Address.isin(['NJ'])) & (df1.name1 isin ('john', 'bob')), 'name1'] = 'N/A'
df1.loc[(df1.Address.isin(['NJ'])) & (df1.name2 isin ('mayer', 'dylan')), 'name2'] = 'N/A'
您始终可以首先将布尔过滤器存储在变量中:
nj_address = df1.Address.isin(['NJ'])
name1_filter = df1.name1 isin ('john', 'bob')
name2_filter = df1.name2 isin ('mayer', 'dylan')
df1.loc[nj_address & name1_filter, 'name1'] = 'N/A'
df1.loc[nj_address & name2_filter, 'name2'] = 'N/A'
答案 1 :(得分:1)
@MartijnPeiters的单独作业as shown对于少数条件是个好主意。
对于大量条件,请考虑使用numpy.select
分隔您的条件和选择。这应该使您的代码更易读,更易于维护。
例如:
import pandas as pd, numpy as np
df = pd.DataFrame({'address': ['NY', 'CA', 'NJ', 'NY', 'WS'],
'name1': ['john', 'mayer', 'dylan', 'bob', 'mary'],
'name2': ['mayer', 'dylan', 'mayer', 'bob', 'bob']})
address_mask = df['address'].isin(('NJ', 'NY'))
conditions = [address_mask & df['name1'].isin(('john', 'bob')),
address_mask & df['name2'].isin(('mayer', 'dylan'))]
choices = ['Option 1', 'Option 2']
df['result'] = np.select(conditions, choices)
print(df)
address name1 name2 result
0 NY john mayer Option 1
1 CA mayer dylan 0
2 NJ dylan mayer Option 2
3 NY bob bob Option 1
4 WS mary bob 0