Предположим, имеющий следующий DataFrame
:Группа по год/месяц/день в панд
rng = pd.date_range('1/1/2011', periods=72, freq='H')
np.random.seed(10)
n = 10
df = pd.DataFrame(
{
"datetime": np.random.choice(rng,n),
"cat": np.random.choice(['a','b','b'], n),
"val": np.random.randint(0,5, size=n)
}
)
Если я теперь groupby
:
gb = df.groupby(['cat','datetime']).sum()
Я получаю итоги для каждого cat
за каждый час:
cat datetime val
a 2011-01-01 00:00:00 1
2011-01-01 09:00:00 3
2011-01-02 16:00:00 1
2011-01-03 16:00:00 1
b 2011-01-01 08:00:00 4
2011-01-01 15:00:00 3
2011-01-01 16:00:00 3
2011-01-02 04:00:00 4
2011-01-02 05:00:00 1
2011-01-02 12:00:00 4
Однако, я хотел бы иметь что-то вроде:
cat datetime val
a 2011-01-01 4
2011-01-02 1
2011-01-03 1
b 2011-01-01 10
2011-01-02 9
я мог бы получить желаемый результат, добавив еще один столбец date
:
df['date'] = df.datetime.apply(pd.datetime.date)
, а затем сделать подобную groupby
: df.groupby(['cat','date']).sum()
. Но меня интересует, есть ли еще питонический способ сделать это? Кроме того, я мог бы взглянуть на месяц или год. Итак, каков был бы правильный путь?
Вы собираетесь просто фильтровать или хотите суммировать/пересчитать? возможно, лучше разделить дату на компоненты дня года и установить ее в индекс, чтобы вы могли называть 'sum (level = [1,2])' например. Или, чтобы установить индекс в столбец даты, 'resample', а затем groupby на 'cat' и выполнить скопления – EdChum
Мне кажется, что решение, которое я предложил, является отправной точкой того, что вы имеете в виду, но я не понять, как это сделать. – Dror