Группировка pandas серии по условию - PullRequest
4 голосов
/ 19 апреля 2020

У меня есть Pandas df с одним столбцом следующих значений.

      Data
0      A
1      A 
2      B
3      A
4      A 
5      A
6      B
7      A
8      A
9      B

Я хочу попытаться сгруппировать эти значения как таковые, для каждого столкновения со значением B я хочу значение группы следует изменить следующим образом:

      Data  Group
0      A      1
1      A      1
2      B      1
3      A      2
4      A      2
5      A      2
6      B      2
7      A      3
8      A      3
9      B      3

Как этого добиться, используя pandas встроенный. каким-либо образом создать любые вспомогательные столбцы для облегчения упомянутой задачи.

Ответы [ 3 ]

6 голосов
/ 19 апреля 2020

Вы можете попробовать cumsum после сравнения, если серия equals B, а затем shift 1 место для включения B в группу:

df['Data'].eq('B').shift(fill_value=False).cumsum().add(1)

0    1
1    1
2    1
3    2
4    2
5    2
6    2
7    3
8    3
9    3
2 голосов
/ 19 апреля 2020

IIU C, обратите внимание, что группа здесь нисходящая. но если вам нужно только разделить группу по данным, выход должен быть таким же

s=df.Data.eq('B').iloc[::-1].cumsum()
s
9    1
8    1
7    1
6    2
5    2
4    2
3    2
2    3
1    3
0    3
Name: Data, dtype: int64
1 голос
/ 19 апреля 2020

Вы также можете использовать pandas.core.groupby.GroupBy.cumcount() в сочетании с pandas.DataFrame.bfill() таким способом.

>>> df['Group'] = (df[df.Data == 'B'].groupby('Data').Data.cumcount() + 1)
>>> df['Group'] = df.Group.bfill()
>>> print(df)
  Data  Group
0    A    1.0
1    A    1.0
2    B    1.0
3    A    2.0
4    A    2.0
5    A    2.0
6    B    2.0
7    A    3.0
8    B    3.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...