groupby («дата») - получает дату и время мин и макс - PullRequest
0 голосов
/ 05 января 2019

Для этого pandas DataFrame (который на самом деле намного длиннее), я хотел бы получить значение b и дату, где b является минимальным, а b максимальным для этого дня. Производительность - это проблема.

   b                date
0  1 1999-12-29 23:59:12
1  2 1999-12-29 23:59:13
2  3 1999-12-29 23:59:14
3  3 1999-12-30 23:59:12
4  1 1999-12-30 23:59:13
5  2 1999-12-30 23:59:14
6  2 1999-12-31 23:59:12
7  3 1999-12-31 23:59:13
8  1 1999-12-31 23:59:14

Так что я бы получил

   b                date
0  1 1999-12-29 23:59:12
2  3 1999-12-29 23:59:14

3  3 1999-12-30 23:59:12
4  1 1999-12-30 23:59:13

7  3 1999-12-31 23:59:13
8  1 1999-12-31 23:59:14

Вот как создается кадр данных:

import datetime
import pandas as pd
df = pd.DataFrame({"a": ["29.12.1999 23:59:12",
                         "29.12.1999 23:59:13",
                         "29.12.1999 23:59:14",

                         "30.12.1999 23:59:12",
                         "30.12.1999 23:59:13",
                         "30.12.1999 23:59:14",

                         "31.12.1999 23:59:12",
                         "31.12.1999 23:59:13",
                         "31.12.1999 23:59:14"],
                   "b": [1,
                         2,
                         3,

                         3,
                         1,
                         2,

                         2,
                         3,
                         1]})
df["date"] = pd.to_datetime(df.a)
df.drop(["a"],axis=1,inplace=True)

Ответы [ 3 ]

0 голосов
/ 05 января 2019

Возможно, не самый производительный из-за итерации дат, но:

df['true_date'] = df['date'].dt.date
date_min_max = df.groupby('true_date')['b'].agg(['min','max'])

result = pd.DataFrame(columns=['b','date'])
for date, min_max_series in date_min_max.iterrows():
    date_values = df[(df['true_date'] == date) & df['b'].isin(min_max_series)][['b','date']]
    result = result.append(date_values)

Out[170]: 
   b                date
0  1 1999-12-29 23:59:12
2  3 1999-12-29 23:59:14
3  3 1999-12-30 23:59:12
4  1 1999-12-30 23:59:13
7  3 1999-12-31 23:59:13
8  1 1999-12-31 23:59:14
0 голосов
/ 05 января 2019
>>> dfg = df.set_index('date').groupby(pd.Grouper(freq='D'))

>>> df['dailyMin'] = df['date'].isin(dfg.idxmin()['b'])
>>> df['dailyMax'] = df['date'].isin(dfg.idxmax()['b'])

>>> df[df[['dailyMin', 'dailyMax']].any(axis=1)]

   b                date  dailyMin  dailyMax
0  1 1999-12-29 23:59:12      True     False
2  3 1999-12-29 23:59:14     False      True
3  3 1999-12-30 23:59:12     False      True
4  1 1999-12-30 23:59:13      True     False
7  3 1999-12-31 23:59:13     False      True
8  1 1999-12-31 23:59:14      True     False

Возможно, это не самый эффективный способ сделать это. У меня есть сомнения по поводу .isin(). Также это частично зависит от вашего набора данных - см. Это обсуждение: Выберите максимальное количество строк в группе - проблема производительности pandas

0 голосов
/ 05 января 2019

Сначала преобразуйте date в формат даты, затем мы сортируем значение b, используя sort_values и drop_duplicates, чтобы получить то, что вам нужно

df=df.assign(days=df.date.dt.date).sort_values('b')
yourdf=pd.concat([df.drop_duplicates('days'),df.drop_duplicates('days',keep='last')]).\
        sort_index().\
          drop('days',1)
yourdf
Out[242]: 
   b                date
0  1 1999-12-29 23:59:12
2  3 1999-12-29 23:59:14
3  3 1999-12-30 23:59:12
4  1 1999-12-30 23:59:13
7  3 1999-12-31 23:59:13
8  1 1999-12-31 23:59:14
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...