Суммирование количества вхождений в день pandas
У меня есть набор данных, подобный этому в фрейме pandas.
score
timestamp
2013-06-29 00:52:28+00:00 -0.420070
2013-06-29 00:51:53+00:00 -0.445720
2013-06-28 16:40:43+00:00 0.508161
2013-06-28 15:10:30+00:00 0.921474
2013-06-28 15:10:17+00:00 0.876710
Мне нужно подсчитать количество измерений, которые происходят, поэтому я ищу что-то вроде этого
count
timestamp
2013-06-29 2
2013-06-28 3
Мне не нравится колонка слияния, я хочу подсчет вхождений в день.
Ответы
Ответ 1
Если ваш индекс timestamp
является DatetimeIndex
:
import io
import pandas as pd
content = '''\
timestamp score
2013-06-29 00:52:28+00:00 -0.420070
2013-06-29 00:51:53+00:00 -0.445720
2013-06-28 16:40:43+00:00 0.508161
2013-06-28 15:10:30+00:00 0.921474
2013-06-28 15:10:17+00:00 0.876710
'''
df = pd.read_table(io.BytesIO(content), sep='\s{2,}', parse_dates=[0], index_col=[0])
print(df)
поэтому df
выглядит следующим образом:
score
timestamp
2013-06-29 00:52:28 -0.420070
2013-06-29 00:51:53 -0.445720
2013-06-28 16:40:43 0.508161
2013-06-28 15:10:30 0.921474
2013-06-28 15:10:17 0.876710
print(df.index)
# <class 'pandas.tseries.index.DatetimeIndex'>
Вы можете использовать:
print(df.groupby(df.index.date).count())
что дает
score
2013-06-28 3
2013-06-29 2
Обратите внимание на важность параметра parse_dates
. Без него индекс будет просто объектом pandas.core.index.Index
. В этом случае вы не можете использовать df.index.date
.
Таким образом, ответ зависит от type(df.index)
, который вы не указали...
Ответ 2
In [145]: df
Out[145]:
timestamp
2013-06-29 00:52:28 -0.420070
2013-06-29 00:51:53 -0.445720
2013-06-28 16:40:43 0.508161
2013-06-28 15:10:30 0.921474
2013-06-28 15:10:17 0.876710
Name: score, dtype: float64
In [160]: df.groupby(lambda x: x.date).count()
Out[160]:
2013-06-28 3
2013-06-29 2
dtype: int64
Ответ 3
В противном случае используйте resample.
In [419]: df
Out[419]:
timestamp
2013-06-29 00:52:28 -0.420070
2013-06-29 00:51:53 -0.445720
2013-06-28 16:40:43 0.508161
2013-06-28 15:10:30 0.921474
2013-06-28 15:10:17 0.876710
Name: score, dtype: float64
In [420]: df.resample('D', how={'score':'count'})
Out[420]:
2013-06-28 3
2013-06-29 2
dtype: int64
ОБНОВЛЕНИЕ: с pandas 0,18 +
как отметил @jbochi, resample с how
теперь устарел. Вместо этого используйте
df.resample('D').apply({'score':'count'})