Reputation: 77
With reference to the codes below, is there a way for me to automatically loop through open_count and close_count to create trips_check? I have been manually typing in the variables 'Open_1', 'Close_1' ... into trip_check whenever a new variable is added, which I find to be inefficient.
door_dur_log = pd.DataFrame([[1, 2.029, 2.208, np.nan, np.nan, 3.01, np.nan, np.nan],
[2, 2.029, 2.208, np.nan, np.nan, 3.01, 2.42, np.nan],
[3, 1.266, np.nan, np.nan, np.nan, 3.846, np.nan, np.nan],
[4, 1.266, 2.224, np.nan, np.nan, 3.846, 3.102, np.nan],
[5, 3.102, 2.923, 3.156, np.nan, 1.318, 2.186, np.nan],
[6, 2.156, np.nan, np.nan, np.nan, 3.039, np.nan, np.nan],
[7, 2.13, 2.195, np.nan, np.nan, 2.982, 2.817, np.nan],
[8, 2.552, np.nan, np.nan, np.nan, 2.408, np.nan, np.nan]], columns = ['Trip', 'Open_1', 'Open_2', 'Open_3', 'Open_4', 'Close_1', 'Close_2', 'Close_3'])
open_count = ['Open_1', 'Open_2', 'Open_3', 'Open_4']
close_count = ['Close_1', 'Close_2', 'Close_3']
trips_check = door_dur_log[(door_dur_log['Open_1'] > 2.75)|(door_dur_log['Open_1'] < 1) |
(door_dur_log['Open_2'] > 2.75)|(door_dur_log['Open_2'] < 1) |
(door_dur_log['Open_3'] > 2.75)|(door_dur_log['Open_3'] < 1) |
(door_dur_log['Open_4'] > 2.75)|(door_dur_log['Open_4'] < 1) |
(door_dur_log['Close_1'] > 2.75)|(door_dur_log['Close_1'] < 1)|
(door_dur_log['Close_2'] > 2.75)|(door_dur_log['Close_2'] < 1)|
(door_dur_log['Close_3'] > 2.75)|(door_dur_log['Close_2'] < 1)]
Upvotes: 0
Views: 28
Reputation: 348
You could do the following
from functools import reduce
lb_open = [door_dur_log[_] > 2.75 for _ in open_count]
lb_close = [door_dur_log[_] > 2.75 for _ in close_count]
ub_open = [door_dur_log[_] < 1 for _ in open_count]
ub_close = [door_dur_log[_] < 1 for _ in close_count]
constraints = [*lb_open, *lb_close, *ub_open, *ub_close]
combined = reduce(lambda a, b : a|b, constraints)
trips_check = door_dur_log[combined]
The first 4 lines are by list comprehension.
The *
operator unpacks a list. It can be used to combine different lists. For example,
a = [1,2,3]
b = [4,5,5]
c = [*a, *b] # c = [1,2,3,4,5,5]
Lastly, the reduce
operation takes a binary operation and accumulates the result by applying the operation on the result accumulated so far and the next element in the list. For example,
a = reduce(lambda x, y : x + y, [1,2,3,4]) # a = 10
More information can be found here.
Upvotes: 1