Python:如果另外两列在同一行

时间:2018-03-07 16:07:57

标签: python string pandas if-statement conditional

我在pandas数据框中有以下示例表。

Col1       Col2        Col3     Col4          Col5
                       No       4/30/2018     No
                       No       4/30/2018     No
Await AIR  7/15/2015   Yes      4/30/2018     No
Await LER  7/15/2015   No       4/30/2018     No
Await TEE  7/15/2015   No       4/30/2018     No

我想实现的逻辑如下: 如果Col3为'No'且Col5为'No',我想删除Col1中的字符串(如果它已经不是空白)并将其留空。

以下是我想要的输出表:

Col1       Col2        Col3     Col4          Col5
                       No       4/30/2018     No
                       No       4/30/2018     No
Awaiting   7/15/2015   Yes      4/30/2018     No
           7/15/2015   No       4/30/2018     No
           7/15/2015   No       4/30/2018     No

我认为我有if语句但不知道如何编写逻辑的其余部分:

if df_EVENT5_21['shipping_filter'] == 'No' and df_EVENT5_21['shipping_filter_2'] == 'No':
    ...

3 个答案:

答案 0 :(得分:2)

使用pd.DataFrame.mask

df[['Col1']].mask(df[['Col3', 'Col5']].eq('No').all(1), '')

        Col1
0           
1           
2  Await AIR
3           
4           

我们可以使用pd.DataFrame.assign

来管道
df.assign(
    **df[['Col1']].mask(df[['Col3', 'Col5']].eq('No').all(1), '')
)

        Col1       Col2 Col3       Col4 Col5
0                         No  4/30/2018   No
1                         No  4/30/2018   No
2  Await AIR  7/15/2015  Yes  4/30/2018   No
3             7/15/2015   No  4/30/2018   No
4             7/15/2015   No  4/30/2018   No

pd.DataFrame.update

df.update(df[['Col1']].mask(df[['Col3', 'Col5']].eq('No').all(1), ''))
df

        Col1       Col2 Col3       Col4 Col5
0                         No  4/30/2018   No
1                         No  4/30/2018   No
2  Await AIR  7/15/2015  Yes  4/30/2018   No
3             7/15/2015   No  4/30/2018   No
4             7/15/2015   No  4/30/2018   No

或者没有双括号

df.assign(
    Col1=df.Col1.mask(df[['Col3', 'Col5']].eq('No').all(1), '')
)

或者

df.update(df.Col1.mask(df[['Col3', 'Col5']].eq('No').all(1), ''))
df

答案 1 :(得分:1)

df['Col1'] = np.where( ((df['Col3 '] == 'No') & (df['Col5'] == 'No']) ), '', df['Col1'])

答案 2 :(得分:1)

一种方法是使用带掩码的.loc访问器:

df = pd.DataFrame({'Col1': ['', '', 'AWait AIR', 'Await LER', 'Await TEE'],
                   'Col2': ['', '', '7/15/2015', '7/15/2015', '7/15/2015'],
                   'Col3': ['No', 'No', 'Yes', 'No', 'No'],
                   'Col4': ['4/30/2018', '4/30/2018', '4/30/2018', '4/30/2018', '4/30/2018'],
                   'Col5': ['No', 'No', 'No', 'No', 'No']})

df.loc[(df[['Col3', 'Col5']] == 'No').all(axis=1), 'Col1'] = ''

#         Col1       Col2 Col3       Col4 Col5
# 0                         No  4/30/2018   No
# 1                         No  4/30/2018   No
# 2  AWait AIR  7/15/2015  Yes  4/30/2018   No
# 3             7/15/2015   No  4/30/2018   No
# 4             7/15/2015   No  4/30/2018   No

<强>解释

此解决方案的灵感来自于创建布尔数组的numpy逻辑:

(df[['Col3', 'Col5']].values == 'No').all(axis=1)

# array([ True,  True, False,  True,  True], dtype=bool)