У меня есть большой фреймворк данных, индексированный по меткам времени, в котором я хотел бы назначать строки для групп в соответствии с временным диапазоном.Группировка строк по временному диапазону в Dataframe Pandas
В следующих данных, например, я сгруппировал строки в пределах 1 мс первой записи в группе.
groupid
1999-12-31 23:59:59.000107 1
1999-12-31 23:59:59.000385 1
1999-12-31 23:59:59.000404 1
1999-12-31 23:59:59.000704 1
1999-12-31 23:59:59.001281 2
1999-12-31 23:59:59.002211 2
1999-12-31 23:59:59.002367 3
я рабочий код, который делает это путем перебора строк, и используя текущую строку, чтобы нарезать dataframe:
dts = sorted([datetime(1999, 12, 31, 23, 59, 59, x) for
x in np.random.randint(1, 999999, 1000)])
df = pd.DataFrame({'groupid': None}, dts)
print df.head(20)
groupid = 1
for dt, row in df.iterrows():
if df.loc[row.name].groupid:
continue
end = dt + timedelta(milliseconds=1)
group = df.loc[dt:end]
df.loc[group.index, 'groupid'] = groupid
groupid += 1
print df.head(20)
Однако, как это часто бывает с iterrows, операция является медленным на больших dataframes. Я делал различные попытки применить функцию и использовать groupby, но безуспешно. Является ли itertuples лучшим, что я могу сделать для повышения производительности (что я сейчас попробую)? Может кто-нибудь дать некоторые советы, пожалуйста?
К сожалению, почему не делает ' df.groupby ('groupid') 'дает вам то, что вы хотите? – EdChum
Ха, это было бы слишком легко :). Это результат операции группировки, которую я хочу применить. Этот столбец не используется, пока я не запустил код выше. – MarkNS
ОК, я понимаю, что вы имеете в виду, просто быстрый взлом - это то, что вы хотите: 'df ['groupid'] = df.index.to_series(). Diff(). Fillna (0) .cumsum(). Dt. microseconds.div (1000) .astype (np.int32) '? – EdChum