Отбросить все строки группы при выполнении условия?

У меня есть панды данных фрейм имеют двухуровневую группу на основе col10 ' а также ' col1 '. Все, что я хочу сделать, это удалить все строки группы, если указанное значение в другом столбце повторялось или это значение не существовало в группе (оставьте группу, в которой указанное значение существовало только один раз), например:

  • Исходный фрейм данных:

    df = pd.DataFrame( {'col0':['A','A','A','A','A','B','B','B','B','B','B','B','c'],'col1':[1,1,2,2,2,1,1,1,1,2,2,2,1], 'col2':[1,2,1,2,3,1,2,1,2,2,2,2,1]})

Мне нужно сохранить строки для группы, например (['A',1],['A',2],['B',2]) в этом оригинальном DF

  • Желаемый фрейм данных:

  • Я попробовал этот шаг:

    df.groupby(['col0','col1']).apply(lambda x: (x['col2']==1).sum()==1)

где результат

col0  col1
A     1        True
      2        True
B     1       False
      2        True
c     1       False
dtype: bool

Как создать нужный Df на основе этого bool?

1 ответ

Решение

Вы можете сделать это, как показано ниже:

m=(df.groupby(['col0','col1'])['col2'].
     transform(lambda x: np.where((x.eq(1)).sum()==1,x,np.nan)).dropna().index)
df.loc[m]

Или же:

df[df.groupby(['col0','col1'])['col2'].transform(lambda x: x.eq(1).sum()==1)]

   col0  col1  col2
0     A     1     1
1     A     1     2
2     A     2     1
3     A     2     2
4     A     2     3
12    c     1     1
Другие вопросы по тегам