Method to return the column based on multiple conditions in Python

时光怂恿深爱的人放手 提交于 2019-12-01 14:09:49

To answer the first part of your question, here's how you would transcribe your if statement:

wifi_user_equality = (df.Wifi_User1 == df.Wifi_User2) | \
                 (df.Wifi_User2 == df.Wifi_User3) | \
                 (df.Wifi_User3 == df.Wifi_User1)
thermostat_change = df.Thermostat != df.Thermostat.shift(1)

Then to return all rows where you have both true:

df[wifi_user_equality & thermostat_change]

         Wifi_User1  Wifi_User2  Wifi_User3  Thermostat  Act_User1  Act_User2   Act_User3 
9           -70         -70         -65          24          0        0.0          0.0  

Or if you only want the index of these:

df.index[(wifi_user_equality & thermostat_change)]

For the second part of your question, it's trickier, but here's a solution:

# We add the first index element too
zero = df.index == df.index[0]

# Get the list of index where the condition is satisfied, in reverse order
idx = list(df.index[(wifi_user_equality & thermostat_change) | zero][::-1])

for i, index in enumerate(idx):
    if index > 0:
        # I use a try/except block in case it cannot find an occurrence of 1
        # (all previous act users are 0).
        # Might not be needed in your specific application
        try:
            x= df.loc[idx[i+1]:(index-1), ['Act_User1','Act_User2','Act_User3']]
            col_of_first_1 = np.where(x==1)[1][-1] + 1
        except:
            col_of_first_1 = 'Not Found'
        # Assign to a new column
        df.loc[index, 'Last_Act_User'] = col_of_first_1

In action:

I've modified your data in order to have a more complex case:

Wifi_User1      Wifi_User2      Wifi_User3      Thermostat   Act_User1   Act_User2  Act_User3
-70             -70             -65             24              0               0           0
-77             -48             -65             24              0               0           0
-58             -48             -48             18              0               1           0
-60             -56             -75             18              0               1           1
-45             -60             -45             18              0               1           1
-67             -45             -60             18              1               0           1
-40             -65             -65             18              1               0           1
-55             -78             -74             18              1               0           0
-55             -45             -65             18              1               0           0
-67             -45             -44             18              0               0           0
-65             -68             -70             18              0               0           0
-70             -70             -65             24              0               0           0
-72             -56             -45             24              0               1           0
-75             -45             -60             24              0               1           0
-77             -48             -65             24              0               0           0

Will give df:

    Wifi_User1  Wifi_User2  Wifi_User3  Thermostat  Act_User1  Act_User2  \
0          -70         -70         -65          24          0          0   
1          -77         -48         -65          24          0          0   
2          -58         -48         -48          18          0          1   
3          -60         -56         -75          18          0          1   
4          -45         -60         -45          18          0          1   
5          -67         -45         -60          18          1          0   
6          -40         -65         -65          18          1          0   
7          -55         -78         -74          18          1          0   
8          -55         -45         -65          18          1          0   
9          -67         -45         -44          18          0          0   
10         -65         -68         -70          18          0          0   
11         -70         -70         -65          24          0          0   
12         -72         -56         -45          24          0          1   
13         -75         -45         -60          24          0          1   
14         -77         -48         -65          24          0          0   

    Act_User3 Last_Act_User  
0           0           NaN  
1           0           NaN  
2           0     Not Found  
3           1           NaN  
4           1           NaN  
5           1           NaN  
6           1           NaN  
7           0           NaN  
8           0           NaN  
9           0           NaN  
10          0           NaN  
11          0             1  
12          0           NaN  
13          0           NaN  
14          0           NaN  
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!