Python Pandas — фильтрация df по количеству уникальных значений в группе

#python #pandas #dataframe #filtering

#python #pandas #фрейм данных #фильтрация

Вопрос:

Вот пример данных, над которыми я работаю. (как pandas df)

     index   inv Rev_stream  Bill_type   Net_rev
       1    1   A           Original    -24.77
       2    1   B           Original    -24.77
       3    2   A           Original    -409.33
       4    2   B           Original    -409.33
       5    2   C           Original    -409.33
       6    2   D           Original    -409.33
       7    3   A           Original    -843.11
       8    3   A           Rebill       279.5
       9    3   B           Original    -843.11
      10    4   A           Rebill       279.5
      11    4   B           Original    -843.11
      12    5   B           Rebill       279.5
 

Как я мог бы отфильтровать этот df таким образом, чтобы получать только строки, в которых комбинация invoice / Rev_stream имеет как исходный, так и повторный вид Net_rev . В приведенном выше примере это будут только строки с индексом 7 и 8.

Есть ли простой способ сделать это, не перебирая весь фрейм данных и не создавая словари invoice RevStream : Bill_type ?

То, что я ищу, это какой-то

 df = df[df[['inv','Rev_stream']]['Bill_type'].unique().len() == 2]
 

К сожалению, приведенный выше код не работает.

Заранее спасибо.

Ответ №1:

Вы можете сгруппировать свои данные по inv Rev_stream столбцам и, а затем проверить для каждой группы, присутствуют ли оба Original и Rebill в Bill_type значениях, и фильтровать на основе условия:

 (df.groupby(['inv', 'Rev_stream'])
   .filter(lambda g: 'Original' in g.Bill_type.values and 'Rebill' in g.Bill_type.values))
 

введите описание изображения здесь

Комментарии:

1. Большое спасибо! Для моих средних наборов данных (около 500 тыс. строк) требуется некоторое время, но это работает как шарм!