Error when using list comprehension : ValueError: -1 is not in range

Viewed 40

I am new to python. I have the following code:

data = {'deviceTimestamp' : ['2022-08-21 00:00:04.019345800','2022-08-21 00:00:09.666780800',
                             '2022-08-21 00:00:15.193316200','2022-08-21 00:00:20.708187',
                             '2022-08-21 00:00:26.212871600','2022-08-21 00:00:31.792147900',
                             '2022-08-21 00:00:37.345935900','2022-08-21 00:00:42.855598900',
                             '2022-08-21 00:00:48.380273','2022-08-21 00:00:53.894567100',
                             '2022-08-21 00:00:59.421452300','2022-08-21 00:01:04.994086700',
                             '2022-08-21 00:01:10.549778100','2022-08-21 00:01:16.067442300',
                             '2022-08-21 00:01:21.585345300','2022-08-21 00:01:27.123348',
                             '2022-08-21 00:01:32.657100400','2022-08-21 00:01:38.681526500',
                             '2022-08-21 00:01:44.254180800','2022-08-21 00:01:49.832247900',
                             '2022-08-21 00:01:55.404809800','2022-08-21 00:02:00.935254300',
                             '2022-08-21 00:02:06.456698200','2022-08-21 00:02:12.023842500',
                             '2022-08-21 00:02:17.601805600'],
        'Failure_Sensor' : [0,1,1,1,0,0,0,1,0,0,0,1,1,1,0,0,0,0,1,0,1,1,1,0,0]
       }
df_failure_sensor = pd.DataFrame(data)
df_failure_sensor['Failure_Sensor_Transition'] = [df_failure_sensor['Failure_Sensor'][0]] + [(df_failure_sensor['Failure_Sensor'][i] if df_failure_sensor['Failure_Sensor'][i-1] != df_failure_sensor['Failure_Sensor'][i]
                                          else (df_failure_sensor['Failure_Sensor'][i] if((df_failure_sensor['Failure_Sensor'][i+1] != df_failure_sensor['Failure_Sensor'][i])) 
                                          else ""))
                                          for i in range(0, len(df_failure_sensor))]

When running this code I am getting the following error: ValueError: -1 is not in range

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
~\anaconda3\lib\site-packages\pandas\core\indexes\range.py in get_loc(self, key, method, tolerance)
    384                 try:
--> 385                     return self._range.index(new_key)
    386                 except ValueError as err:

ValueError: -1 is not in range

The above exception was the direct cause of the following exception:

KeyError                                  Traceback (most recent call last)
C:\Users\ABDALL~1\AppData\Local\Temp/ipykernel_19832/4208152234.py in <module>
     15        }
     16 df_failure_sensor = pd.DataFrame(data)
---> 17 df_failure_sensor['Failure_Sensor_Transition'] = [df_failure_sensor['Failure_Sensor'][0]] + [(df_failure_sensor['Failure_Sensor'][i] if df_failure_sensor['Failure_Sensor'][i-1] != df_failure_sensor['Failure_Sensor'][i]
     18                                           else (df_failure_sensor['Failure_Sensor'][i] if((df_failure_sensor['Failure_Sensor'][i+1] != df_failure_sensor['Failure_Sensor'][i])) 
     19                                           else ""))

C:\Users\ABDALL~1\AppData\Local\Temp/ipykernel_19832/4208152234.py in <listcomp>(.0)
     15        }
     16 df_failure_sensor = pd.DataFrame(data)
---> 17 df_failure_sensor['Failure_Sensor_Transition'] = [df_failure_sensor['Failure_Sensor'][0]] + [(df_failure_sensor['Failure_Sensor'][i] if df_failure_sensor['Failure_Sensor'][i-1] != df_failure_sensor['Failure_Sensor'][i]
     18                                           else (df_failure_sensor['Failure_Sensor'][i] if((df_failure_sensor['Failure_Sensor'][i+1] != df_failure_sensor['Failure_Sensor'][i])) 
     19                                           else ""))

~\anaconda3\lib\site-packages\pandas\core\series.py in __getitem__(self, key)
    940 
    941         elif key_is_scalar:
--> 942             return self._get_value(key)
    943 
    944         if is_hashable(key):

~\anaconda3\lib\site-packages\pandas\core\series.py in _get_value(self, label, takeable)
   1049 
   1050         # Similar to Index.get_value, but we do not fall back to positional
-> 1051         loc = self.index.get_loc(label)
   1052         return self.index._get_values_for_loc(self, loc, label)
   1053 

~\anaconda3\lib\site-packages\pandas\core\indexes\range.py in get_loc(self, key, method, tolerance)
    385                     return self._range.index(new_key)
    386                 except ValueError as err:
--> 387                     raise KeyError(key) from err
    388             raise KeyError(key)
    389         return super().get_loc(key, method=method, tolerance=tolerance)

KeyError: -1

How can I solve this issue keeping in mind that the conditions should remain as they are ?

I tried using a different approach here is the following and applying the same list comprehension:

df_failure_sensor = df_failure_sensor['Failure_Sensor'].values.tolist()
df_failure_sensor_transition = [df_failure_sensor [0]] + [(df_failure_sensor [i] if df_failure_sensor [i-1] != df_failure_sensor [i]
                                                     else (df_failure_sensor [i] if (df_failure_sensor [i+1]!=df_failure_sensor [i])
                                                     else ''))
                                                     for i in range(0,len(df_failure_sensor )-1)]
df_failure_sensor = pd.DataFrame(df_failure_sensor_transition , columns=['Failure_Transition'])
df_failure_sensor = df_failure_sensor [df_failure_sensor ['Failure_Transition'] != '']

This approach works but I can't continue my code because I also need the deviceTimestamp afterwards

Does someone have a solution for this problem ?

0 Answers
Related