在pandas / python中使用.loc嵌套if语句

时间:2018-04-25 21:00:26

标签: python python-3.x pandas if-statement dataframe

我正在使用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实现上述逻辑吗?或者还有其他方法吗?

2 个答案:

答案 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