У меня есть Multiindex DataFrame с pd.timestamp в качестве индекса верхнего уровня и некоторыми произвольными параметрами в качестве второго уровня. Вы можете использовать этот фрагмент для воспроизведения некоторых фиктивных данных:
level0 = pd.period_range(start='2020-01-01-00:00:00', end='2020-01-01-00:01:00', freq='s')
level1 = ['foo', 'bar', 'foobar']
values = np.random.rand(len(level1)*len(level0))
idx = pd.MultiIndex.from_product([level0, level1], names=['time', 'level1'])
col = ['value']
df = pd.DataFrame(values, idx, col)
print(df)
Что создает результат:
value
time level1
2020-01-01 00:00:00 foo 0.345507
bar 0.147654
foobar 0.617000
2020-01-01 00:00:01 foo 0.430975
bar 0.783075
... ...
2020-01-01 00:00:59 bar 0.027083
foobar 0.553220
2020-01-01 00:01:00 foo 0.253957
bar 0.569881
foobar 0.976768
Теперь я хочу использовать каждую n -ю секунду в качестве данных для дальнейших расчетов. Мой первый подход заключался в использовании .iloc[::n]
, который отлично работает, если Dataframe сначала распакован. Таким образом, код df.unstack().iloc[::5].stack()
дает именно то, что мне нужно:
value
time level1
2020-01-01 00:00:00 bar 0.147654
foo 0.345507
foobar 0.617000
2020-01-01 00:00:05 bar 0.083129
foo 0.591585
foobar 0.660372
2020-01-01 00:00:10 bar 0.460798
foo 0.308138
foobar 0.622412
... ...
2020-01-01 00:00:55 bar 0.700964
foo 0.556782
foobar 0.601582
2020-01-01 00:01:00 bar 0.569881
foo 0.253957
foobar 0.976768
Однако распаковка и стек становится очень ресурсоемкими, когда df становится большим. И я чувствую, что есть простое, элегантное и «дешевое» решение, которое я просто не могу gr asp.
Есть ли решение для выбора каждой n -ой метки времени что позволяет избежать распаковки данных?
РЕДАКТИРОВАТЬ: Для всех, кто читает это: Хотя ответ Джезраэля - хороший способ сделать это и научил меня нескольким вещам о том, как справиться с проблемой, это оказалось для моего случая (данные за месяц и около 300 записей уровня "level1"), что метод unstack().iloc[::n].stack()
быстрее и лучше масштабируется.