рассчитать количество по дням - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть фрейм данных, в котором есть столбцы created_at и entities, которые выглядят так:

    created_at                         entities
2017-10-29 23:06:28     {'hashtags': [{'text': 'OPEC', 'indices': [0, ...
2017-10-29 22:28:20     {'hashtags': [{'text': 'Iraq', 'indices': [21,...
2017-10-29 20:01:37     {'hashtags': [{'text': 'oil', 'indices': [58, ...
2017-10-29 20:00:14     {'hashtags': [{'text': 'oil', 'indices': [38, ...
2017-10-27 08:44:30     {'hashtags': [{'text': 'Iran', 'indices': [19,...
2017-10-27 08:44:10     {'hashtags': [{'text': 'Oil', 'indices': [17, ...
2017-10-27 08:43:13     {'hashtags': [{'text': 'Oil', 'indices': [0, 4...
2017-10-27 08:43:00     {'hashtags': [{'text': 'Iran', 'indices': [19,.

Я хочу рассчитать количество объектов для каждого дня.В основном я хочу получить что-то вроде

created_at    number_of_entities
2017-10-29           4
2017-10-27           4

Как это сделать?У меня pandas 0.23.4

Ответы [ 5 ]

0 голосов
/ 09 декабря 2018

Вы можете использовать floor или date для времени удаления, а затем value_counts для подсчета, последний rename_axis и reset_index для 2 столбцов DataFrame:

df = (df['created_at'].dt.floor('d')
                     .value_counts()
                     .rename_axis('created_at')
                     .reset_index(name='number_of_entities'))
print (df)
  created_at  number_of_entities
0 2017-10-29                   4
1 2017-10-27                   4

Или:

df = (df['created_at'].dt.date
                     .value_counts()
                     .rename_axis('created_at')
                     .reset_index(name='number_of_entities'))

Если хотите избежать сортировки по умолчанию в value_counts передать параметрsort=False:

df = (df['created_at'].dt.floor('d')
                     .value_counts(sort=False)
                     .rename_axis('created_at')
                     .reset_index(name='number_of_entities'))
0 голосов
/ 09 декабря 2018

Данные даны:

In [3]: df
Out[3]: 
            created_at                                           entities
0  2017-10-29 23:06:28  {'hashtags': [{'text': 'OPEC', 'indices': [0, ...
1  2017-10-29 22:28:20  {'hashtags': [{'text': 'Iraq', 'indices': [21,...
2  2017-10-29 20:01:37  {'hashtags': [{'text': 'oil', 'indices': [58, ...
3  2017-10-29 20:00:14  {'hashtags': [{'text': 'oil', 'indices': [38, ...
4  2017-10-27 08:44:30  {'hashtags': [{'text': 'Iran', 'indices': [19,...
5  2017-10-27 08:44:10  {'hashtags': [{'text': 'Oil', 'indices': [17, ...
6  2017-10-27 08:43:13  {'hashtags': [{'text': 'Oil', 'indices': [0, 4...
7  2017-10-27 08:43:00    {'hashtags': [{'text': 'Iran', 'indices': [19,.

Вы можете использовать groupby (..). Count () следующим образом, чтобы получить то, что вы хотите:

In [4]: df[["created_at"]].groupby(pd.to_datetime(df["created_at"]).dt.date).count().rename(columns={"created_at":"number_of_entities"}).reset_index()
    ...: 
Out[4]: 
   created_at  number_of_entities
0  2017-10-27                   4
1  2017-10-29                   4

Обратите внимание:

, если столбец created_at уже имеет формат даты и времени, вы можете просто использовать следующее:

df[["created_at"]].groupby(df.created_at.dt.date).count().rename(columns={"created_at":"number_of_entities"}).reset_index()
0 голосов
/ 09 декабря 2018

Учитывая

>>> df
           created_at  entities
0 2017-10-29 23:06:28         1
1 2017-10-29 22:28:20         2
2 2017-10-29 20:01:37         3
3 2017-10-29 20:00:14         4
4 2017-10-27 08:44:30         5
5 2017-10-27 08:44:10         6
6 2017-10-27 08:43:13         7
7 2017-10-27 08:43:00         8

с

>>> df.dtypes
created_at    datetime64[ns]
entities               int64
dtype: object

, вы можете выдавать:

>>> pd.PeriodIndex(df['created_at'], freq='D').value_counts()
2017-10-29    4
2017-10-27    4
Freq: D, Name: created_at, dtype: int64

Более хороший подход без конструктора PeriodIndex был предложен jezraelв комментариях:

>>> df['created_at'].dt.to_period('D').value_counts()
2017-10-27    4
2017-10-29    4

С некоторым дополнительным переименованием, чтобы соответствовать вашему выводу, это начинает выглядеть подозрительно как решение Jezrael.;)

>>> datecol = 'created_at'
>>> df[datecol].dt.to_period('D').value_counts().rename_axis(datecol).reset_index(name='number_of_entities')
  created_at  number_of_entities
0 2017-10-27                   4
1 2017-10-29                   4

В качестве альтернативы вы можете установить индекс для дат, а затем resample:

>>> df.set_index('created_at').resample('D').size()
created_at
2017-10-27    4
2017-10-28    0
2017-10-29    4
Freq: D, dtype: int64

... и если необходимо преобразование в точный вывод:

>>> resampled = df.set_index('created_at').resample('D').size()
>>> resampled[resampled != 0].reset_index().rename(columns={0: 'number_of_entities'})
  created_at  number_of_entities
0 2017-10-27                   4
1 2017-10-29                   4

Еще немного контекста: resample особенно полезен для произвольных временных интервалов, например, «пять минут».Следующий пример взят непосредственно из книги Уэса МакКинни «Питон для анализа данных».

>>> N = 15
>>> times = pd.date_range('2017-05-20 00:00', freq='1min', periods=N)
>>> df = pd.DataFrame({'time': times, 'value': np.arange(N)})
>>> 
>>> df
                  time  value
0  2017-05-20 00:00:00      0
1  2017-05-20 00:01:00      1
2  2017-05-20 00:02:00      2
3  2017-05-20 00:03:00      3
4  2017-05-20 00:04:00      4
5  2017-05-20 00:05:00      5
6  2017-05-20 00:06:00      6
7  2017-05-20 00:07:00      7
8  2017-05-20 00:08:00      8
9  2017-05-20 00:09:00      9
10 2017-05-20 00:10:00     10
11 2017-05-20 00:11:00     11
12 2017-05-20 00:12:00     12
13 2017-05-20 00:13:00     13
14 2017-05-20 00:14:00     14
>>> 
>>> df.set_index('time').resample('5min').size()
time
2017-05-20 00:00:00    5
2017-05-20 00:05:00    5
2017-05-20 00:10:00    5
Freq: 5T, dtype: int64
0 голосов
/ 09 декабря 2018

Использование groupby.size

# Convert to datetime dtype if you haven't.
df1.created_at = pd.to_datetime(df1.created_at)

df2 = df1.groupby(df1.created_at.dt.date).size().reset_index(name='number_of_entities')

print (df2)

   created_at  number_of_entities
0  2017-10-27                   4
1  2017-10-29                   4
0 голосов
/ 09 декабря 2018

Вы можете группировать по дням, используя df.groupby(df.created_at.dt.day).

Что касается функции вычисления подсчетов, для этого нам понадобится полная строка, ваша структура данных выглядит очень странно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...