фрейм данных с двумя условиями в двух разных столбцах - PullRequest
1 голос
/ 09 июля 2020

Я хочу отфильтровать фрейм данных на основе двух условий в двух разных столбцах. В приведенном ниже примере я хочу отфильтровать фрейм данных df, чтобы он содержал такие строки, чтобы он содержал uid s с количеством значений для столбца val больше 4, больше 2

df = pd.DataFrame({'uid':[1,1,1,2,2,3,3,4,4,4],'iid':[11,12,13,12,13,13,14,14,11,12], 'val':[3,4,5,3,5,4,5,4,3,4]})

Для этого фрейма данных мой вывод должен быть

 df
   uid  iid  val
0    1   11    3
1    1   12    4
2    1   13    5
5    3   13    4
6    3   14    5
7    4   14    4
8    4   11    3
9    4   12    4

Здесь я отфильтровал uid 2, потому что количество строк с uid == 2 и val >= 4 меньше 2 . Я хочу сохранить только uid строк, для которых количество val со значениями больше 4 больше или равно 2.

1 Ответ

2 голосов
/ 09 июля 2020

вам нужно groupby.transform с sum, один раз проверьте, где val больше или равно ge, чем 4. и убедитесь, что результат равен ge, чтобы использовать его в качестве логического фильтра для df.

print (df[df['val'].ge(4).groupby(df['uid']).transform(sum).ge(2)])
   uid  iid  val
0    1   11    3
1    1   12    4
2    1   13    5
5    3   13    4
6    3   14    5
7    4   14    4
8    4   11    3
9    4   12    4

РЕДАКТИРОВАТЬ: другой способ избежать groupby.transform - это loc строки, где val равно ge, чем 4, и uid столбца, использовать value_counts и получить True, где ge 2, затем map обратно в столбец uid, чтобы создать логический фильтр для df. тот же результат и потенциально быстрее.

df[df['uid'].map(df.loc[df['val'].ge(4), 'uid'].value_counts().ge(2))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...