在Python中基于多个条件返回列的方法 [英] Method to return the column based on multiple conditions in Python

查看:165
本文介绍了在Python中基于多个条件返回列的方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个如下数据框。根据几个条件,我需要重新检查该列。

  Wifi_User1 Wifi_User2 Wifi_User3恒温器Act_User1 Act_User2 Act_User3 
-58 - 48 -60 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

条件如下:

  if(Wifi_User1 == Wifi_User2)或(Wifi_User2 == Wifi_User3)
或( Wifi_User3 == Wifi_User1)或(Wifi_User1 == Wifi_User2 == Wifi_User3)
当恒温器值改变

然后

扫描Act_User1,Act_User2,Act_User3列对于恒温器值变化之前1
的第一个实例。

如果是Act_user1,如果其Act_User2返回2
,则返回1
否则返回3

例如,在上面的数据集中,第10行 Wifi_user1 == Wifi_User2 ,恒温器值从18变为24。 / p>

对于这种情况,我将扫描Act_User1,Act_User2,Act_User3。并且看到,Act_User1的第一个实例1发生,因此我需要在该特定行的新列中返回值1.



请帮助我如何为了解决这个问题,因为我是Python新手并且正在探索python

解决方案

要回答你问题的第一部分,这里是如何转录你的if语句:

  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)

然后返回所有行都为true的行:

  df [wifi_user_equality& thermostat_change] 

Wifi_User1 Wifi_User2 Wifi_User3恒温器Act_User1 Act_User2 Act_User3
9 -70 -70 -65 24 0 0.0 0.0

或者如果您只想要这些索引:

  df.index [( wifi_user_equality& thermostat_change)] 






第二部分你的问题,这很棘手,但这是一个解决方案:

 #我们添加第一个索引元素
zero = df.index == df.index [0]

#以相反的顺序获取条件满足的索引列表
idx = list(df.index [(wifi_user_equality& thermostat_change)| zero] [:: - 1])$ ​​b
$ b for i,index in enumerate(idx):
if index> 0:
#我使用try / except块,以防它找不到1
#的出现(所有以前的act用户都是0)。
#在您的特定应用中可能不需要
尝试:
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
除外:
col_of_first_1 ='未找到'
#分配给新列
df.loc [index,'Last_Act_User'] = col_of_first_1






在行动中:



我修改了你的数据以便有更复杂的案例:

  Wifi_User1 Wifi_User2 Wifi_User3恒温器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 -5 6 -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给 df

  Wifi_User1 Wifi_User2 Wifi_User3恒温器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 -5 5 -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未找到
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


I have a dataframe as below. Based on few conditions, I need to retrive the column.

    Wifi_User1      Wifi_User2      Wifi_User3      Thermostat   Act_User1   Act_User2  Act_User3
    -58             -48             -60             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

The conditions are as follows:

if (Wifi_User1==Wifi_User2) or (Wifi_User2==Wifi_User3)
  or (Wifi_User3==Wifi_User1) or (Wifi_User1==Wifi_User2==Wifi_User3) 
   and when the thermostat value is changing

then

scan Act_User1, Act_User2, Act_User3 columns for the first instance of 1 
before the thermostat value changes. 

If its Act_user1, return 1 
else if its Act_User2 return 2
else return 3

For example, in the above dataset, at 10th row Wifi_user1 == Wifi_User2 and the thermostat value is changing from 18 to 24.

For this condition, I will scan Act_User1, Act_User2, Act_User3. And see that, the first instance of 1 occurs for Act_User1, hence I need to return the value 1 in the new column for this particular row.

Please help me as how to go about it, as I'm new to Python and exploring python

解决方案

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  

这篇关于在Python中基于多个条件返回列的方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆