#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 тыс. строк) требуется некоторое время, но это работает как шарм!