Проверьте, все ли элементы в группе равны, используя pandas GroupBy - PullRequest
0 голосов
/ 28 декабря 2018

Есть ли питонический способ группировки по полю и проверки, имеют ли все элементы каждой результирующей группы одинаковое значение?

Образцы данных:

              datetime rating  signal
0  2018-12-27 11:33:00     IG       0
1  2018-12-27 11:33:00     HY      -1
2  2018-12-27 11:49:00     IG       0
3  2018-12-27 11:49:00     HY      -1
4  2018-12-27 12:00:00     IG       0
5  2018-12-27 12:00:00     HY      -1
6  2018-12-27 12:49:00     IG       0
7  2018-12-27 12:49:00     HY      -1
8  2018-12-27 14:56:00     IG       0
9  2018-12-27 14:56:00     HY      -1
10 2018-12-27 15:12:00     IG       0
11 2018-12-27 15:12:00     HY      -1
12 2018-12-20 15:14:00     IG       0
13 2018-12-20 15:14:00     HY      -1
14 2018-12-20 15:50:00     IG      -1
15 2018-12-20 15:50:00     HY      -1
16 2018-12-27 13:26:00     IG       0
17 2018-12-27 13:26:00     HY      -1
18 2018-12-27 13:44:00     IG       0
19 2018-12-27 13:44:00     HY      -1
20 2018-12-27 15:06:00     IG       0
21 2018-12-27 15:06:00     HY      -1
22 2018-12-20 15:48:00     IG       0
23 2018-12-20 15:48:00     HY      -1

Часть группировки может бытьсделано

df.groupby([datetime.dt.date,'rating'])

Однако я уверен, что должен быть простой способ использовать группировщик и использовать инструкцию transform для возврата 1, если все значения из signal совпадают.

Желаемый выход

2018-12-20  HY            True
            IG            False
2018-12-27  HY            True
            IG            True

Ответы [ 2 ]

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

Попробуйте найти альтернативу, не используя groupby просто для удовольствия

df.datetime=df.datetime.dt.date

s=pd.crosstab(df.datetime,[df.rating,df.signal])


s.eq(s.sum(axis=1,level=0),1).any(level=0,axis=1).stack()
Out[556]: 
datetime    rating
2018-12-20  HY         True
            IG        False
2018-12-27  HY         True
            IG         True
dtype: bool
0 голосов
/ 28 декабря 2018

Используйте groupby и nunique и проверьте, равен ли результат 1:

df.groupby([df.datetime.dt.date, 'rating']).signal.nunique().eq(1)

datetime    rating
2018-12-20  HY         True
            IG        False
2018-12-27  HY         True
            IG         True
Name: signal, dtype: bool

Или, аналогично, используйте apply с set преобразованием:

(df.groupby([df.datetime.dt.date, 'rating']).signal
   .apply(lambda x: len(set(x)) == 1))

datetime    rating
2018-12-20  HY         True
            IG        False
2018-12-27  HY         True
            IG         True
Name: signal, dtype: bool

PS. Вам не нужно присваивать временный столбец, groupby принимает произвольные аргументы группировщика.

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