2015-08-31 2 views
1

Я пробовал это в Stata и не смог. Пытаться этим Python/pandas теперь - что-то, что я менее знаком с ...Pandas: Итерация по отсортированным строкам в df, реализация счетчика

У меня есть дата-кадр данных посещаемости, причем каждая строка является временной записью или выходом. Это выглядит так: baseline data

И я хочу рассчитать, сколько людей находится в офисе в любой момент времени, в любой день. Я хотел бы настроить counter, который добавляет 1 для каждой записи (type=="O") и вычитает 1 для каждого выхода().

попытка

Мой Python заключается в следующем:

  df = pd.read_stata("some-data.dta") 

      sort = df.sort(['date', 'att_time']) 

      for i, day in enumerate(sort['date']): 
       sort['counter'][i] = 0 
       if type=="O": 
        sort['counter'][i] = sort['counter'][i-1] + 1 
       elif type=="C": 
        sort['counter'][i] = sort['counter'][i-1] - 1 

Что выдает эту ошибку:

__main__:2 : SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame

See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

От чтения других SO сообщения, я попытался установить флаг копирования на False (sort.is_copy==False), но ошибка сообщение всплывает. Кроме того, беспокойно, я заметил, что это, возможно, не итерация отсортированного списка:

   for i, day in enumerate(sorted(sort['date'])): 
        print i, day, sort['date'][i] 

day и sort['date'][i], которые должны быть на ту же дату, не являются. Поэтому мой индекс i, на первый взгляд, нельзя полагаться, даже если я обошел SettingWithCopyWarning. Halp?

ответ

3

Вы можете использовать cumsum, чтобы упростить процесс, который быстрее, чем ручное переключение по всем строкам.

# artificial data 
# ========================= 
df = pd.DataFrame('0 0 0 0 C 0 C 0 0 C 0 C'.split(), index=pd.date_range('2015-08-31 08:00:00', periods=12, freq='5min'), columns=['type']) 
df 

        type 
2015-08-31 08:00:00 0 
2015-08-31 08:05:00 0 
2015-08-31 08:10:00 0 
2015-08-31 08:15:00 0 
2015-08-31 08:20:00 C 
2015-08-31 08:25:00 0 
2015-08-31 08:30:00 C 
2015-08-31 08:35:00 0 
2015-08-31 08:40:00 0 
2015-08-31 08:45:00 C 
2015-08-31 08:50:00 0 
2015-08-31 08:55:00 C 


# processing 
# =================================== 
df['counter'] = df['type'].map({'0': 1, 'C': -1}).cumsum() 
df 

        type counter 
2015-08-31 08:00:00 0  1 
2015-08-31 08:05:00 0  2 
2015-08-31 08:10:00 0  3 
2015-08-31 08:15:00 0  4 
2015-08-31 08:20:00 C  3 
2015-08-31 08:25:00 0  4 
2015-08-31 08:30:00 C  3 
2015-08-31 08:35:00 0  4 
2015-08-31 08:40:00 0  5 
2015-08-31 08:45:00 C  4 
2015-08-31 08:50:00 0  5 
2015-08-31 08:55:00 C  4 
+0

Удивительно! Python> Stata, я думаю. Так легко. Я собирался спросить, сохраняет ли это порядок сортировки (так как мне нужно сделать 'cumsum()' в течение нескольких дней), но похоже, что это так. –

Смежные вопросы