Найти строку, соответствующую критериям нескольких столбцов - PullRequest
3 голосов
/ 30 октября 2019

У меня есть фрейм данных с 2M строками в следующем формате:

ID   Number
1    30
1    40
1    60
2    10
2    30
3    60

Мне нужно выбрать идентификаторы с номерами 30 и 40 (в этом случае вывод должен быть 1).

Я знаю, что мы можем создать новый DF, имеющий только номера 30 и 40, а затем сгруппировать, чтобы увидеть, какие идентификаторы имеют больше, чем число 1. Но есть ли способ сделать оба в выражении groupby?

Мой код:

a=df[(df['Number']==30) | (df['Number']==40) ]
b=a.groupby('ID')['Number'].nunique().to_frame(name='tt').reset_index()
b[b['tt'] > 1]

Ответы [ 3 ]

2 голосов
/ 30 октября 2019

Использовать groupby filter и issubset

s = {30, 40}
df.groupby('ID').filter(lambda x: s.issubset(set(x.Number)))

Out[158]:
   ID  Number
0   1      30
1   1      40
2   1      60
1 голос
/ 30 октября 2019

Я нахожу тот факт, что метод describe() объектов Groupby возвращает фрейм данных очень полезным.

Вывод temp1 = a.groupby("ID").describe() и temp2 = a.groupby("ID").describe()["Number"] в блокнот Jupyter, чтобы посмотреть, как они выглядят, затемследующий код (который следует из вашего) должен иметь смысл.

summary = a.groupby("ID").describe()["Number"]
summary.loc[summary["count"] > 1].index
1 голос
/ 30 октября 2019

Я бы создал df для каждого условия, а затем присоединился к ним:

df1 = df[df.Number == 30][['Number']]
df2 = df[df.Number == 40][['Number']]

df3 = df1.join(df2,how='inner',on='Number')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...