Панды: Удалить строки группы, где за определенным значением для этой группы следует другое значение - PullRequest
0 голосов
/ 07 декабря 2018
df = pd.DataFrame({"name":["A", "A","A", "A", "B" ,"B","B" ,"B", "C", "C","C", "C"],
                   "nickname":["X","Y","X","Z","X","Y","X","Y","Y", "X","Y", "Y"]})

Как я могу сгруппировать df по «имени» и удалить строки в каждой группе, где за «X» сразу же следует «Y»?т. е. в этом случае следует удалить «X».

Требуемый вывод:

1     A        Y
2     A        X
3     A        Z
5     B        Y
7     B        Y
8     C        Y
10    C        Y
11    C        Y

Ответы [ 2 ]

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

Используйте DataFrameGroupBy.shift для сдвига по группам и сравнивайте ne для !=, цепочку с побитовым OR - | и фильтруйте по boolean indexing:

m = df.groupby('name')['nickname'].shift(-1).ne('Y') | df['nickname'].ne('X')

df = df[m]
print (df)
   name nickname
1     A        Y
2     A        X
3     A        Z
5     B        Y
7     B        Y
8     C        Y
10    C        Y
11    C        Y

РЕДАКТИРОВАТЬ:

df = pd.DataFrame({"name":["A", "A","A", "A", "B" ,"B","B" ,"B", "C", "C","C", "C"],
                   "nickname":["X","Y","X","Z","X","Y","X","X","Y", "X","Y", "Y"]})

print (df)
   name nickname
0     A        X
1     A        Y
2     A        X
3     A        Z
4     B        X
5     B        Y
6     B        X
7     B        X
8     C        Y
9     C        X
10    C        Y
11    C        Y

m = df.groupby('name')['nickname'].shift(-1).ne('Y') | df['nickname'].ne('X')

df1 = df[m]
print (df1)
   name nickname
1     A        Y
2     A        X
3     A        Z
5     B        Y
6     B        X
7     B        X
8     C        Y
10    C        Y
11    C        Y

print(df[(df['nickname']!='X') | (df['nickname'].shift(-1)!='Y')])
   name nickname
1     A        Y
2     A        X
3     A        Z
5     B        Y
6     B        X
8     C        Y
10    C        Y
11    C        Y
0 голосов
/ 07 декабря 2018

Используйте для этого df[...], отфильтруйте ненужные, группировка не нужна:

print(df[(df['nickname']!='X') | (df['nickname'].shift(-1)!='Y')])

Вывод:

   name nickname
1     A        Y
2     A        X
3     A        Z
5     B        Y
7     B        Y
8     C        Y
10    C        Y
11    C        Y

Обновление:

print(df[(df['nickname']!='X') | (df['nickname'].shift(-1).isin(['Y','Z'])==0)])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...