Как выбрать строки из столбца индекса в pandas - PullRequest
0 голосов
/ 05 апреля 2020

Я хочу использовать for-loop, чтобы найти последовательные периоды времени на основе другого столбца data в df, ie. периоды времени (определенные с использованием меток времени начала и конца), где data> 20. В df, timestamp составлен указатель. Я думаю, что проблема в том, что в l oop я не указал правильно, чтобы выбрать строку из столбца индекса в кадре данных.

for-loop:

for i in range(len(df3)): 
    if i >0:

        activities = []          
        start_time = None          

        if (df.loc[i, 'data'] >= 20):                                   

            if start_time == None:   
                start_time = df.loc[i, 'timestamp']
        else:

            if start_time != None:
                end_time = df.loc[i-1, 'timestamp']

                duration = (end_time - start_time).seconds
                activities.append((duration, start_time, end_time))
                start_time = None 

return activities

df:

                        id      timestamp               data    Date        sig     events
timestamp                           
2020-01-15 06:12:49.213 40250   2020-01-15 06:12:49.213 20.0    2020-01-15  -1.0    1.0
2020-01-15 06:12:49.313 40251   2020-01-15 06:12:49.313 19.5    2020-01-15  1.0     0.0
2020-01-15 08:05:10.083 40256   2020-01-15 08:05:10.083 20.0    2020-01-15  1.0     0.0

Возвращено:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-11-9853026603d5> in <module>()
      9 
     10 
---> 11         if (df.loc[i, 'data'] >= 20):                                   
     12 
     13             if start_time == None:

7 frames
/usr/local/lib/python3.6/dist-packages/pandas/core/indexes/base.py in _invalid_indexer(self, form, key)
   3074         """
   3075         raise TypeError(
-> 3076             f"cannot do {form} indexing on {type(self)} with these "
   3077             f"indexers [{key}] of {type(key)}"
   3078         )

TypeError: cannot do index indexing on <class 'pandas.core.indexes.datetimes.DatetimeIndex'> with these indexers [1] of <class 'int'>

Обновление:

По предложению @jcaliz, я попробовал приведенный ниже код и изменил отступы для return для разных вариантов:

for i in range(len(df)): 
    if i >0:

        activities = []           
        start_time = None          


        if (df.iloc[I].data >= 20):                                   
            if start_time == None:   
                start_time = df.iloc[i].timestamp
        else:

            if start_time != None:
                end_time = df.iloc[i-1].timestamp

                duration = (end_time - start_time).seconds
                activities.append((duration, start_time, end_time))
                start_time = None


return activities

, но с той же ошибкой:

  File "<ipython-input-24-d78e4605aebe>", line 31
    return activities
                            ^
SyntaxError: 'return' outside function

1 Ответ

1 голос
/ 05 апреля 2020

loc используется для текста, а не целочисленного индекса, вместо этого используйте iloc. Изменение:

if (df.loc[i, 'data'] >= 20):

На

if (df.iloc[i].data >= 20):

То же самое относится и к другим loc s, как df.loc[i, 'timestamp']

Редактировать:

Лучше было бы не использовать для l oop

  1. start_time то же самое, что timestamp
  2. end_time, как у предыдущего timestamp
  3. duration - разница в секундах

Процесс будет:

# Assign previous record's timestamp as end time
df['end_time'] = df['timestamp'].shift(1)

df['duration'] = df.apply(lambda x: (x['end_time'] -
                                     x['timestamp']).seconds, axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...