在Python中基于多个条件返回列的方法 [英] Method to return the column based on multiple conditions in 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屋!