Я пробовал это в Stata и не смог. Пытаться этим Python/pandas теперь - что-то, что я менее знаком с ...Pandas: Итерация по отсортированным строкам в df, реализация счетчика
У меня есть дата-кадр данных посещаемости, причем каждая строка является временной записью или выходом. Это выглядит так:
И я хочу рассчитать, сколько людей находится в офисе в любой момент времени, в любой день. Я хотел бы настроить 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 DataFrameSee 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?
Удивительно! Python> Stata, я думаю. Так легко. Я собирался спросить, сохраняет ли это порядок сортировки (так как мне нужно сделать 'cumsum()' в течение нескольких дней), но похоже, что это так. –