У меня есть фрейм данных, как показано ниже
ID,color
1, Yellow
1, Red
1, Green
2, Red
2, np.nan
3, Green
3, Red
3, Green
4, Yellow
4, Red
5, Green
5, np.nan
6, Red
7, Red
8, Green
8, Yellow
fd = pd.read_clipboard(sep=',')
fd = fd.groupby('ID',as_index=False)['color'].aggregate(lambda x: list(x))
Как вы можете видеть во входном фрейме данных, некоторые идентификаторы имеют несколько связанных с ними цветов.
Теперь я хотел бы создать подмножество фрейма данных с идентификаторами, которые имеют как Yellow, так и Green
Итак, я попробовал ниже и получил список цветов для каждого идентификатора.
fd.groupby('ID',as_index=False)['color'].aggregate(lambda x: list(x))
Я хотел бы проверить такие значения, как Yellow и Green в списке групп, а затем подмножить фрейм данных
Я ожидаю, что мой вывод будет таким, как показано ниже (только два идентификатора имеют желтый и зеленый вместе)
ID
1
1
8
8
Обновить
входной фрейм данных выглядит следующим образом






Отфильтруйте строки, имеющие желтый или зеленый цвет, затем сгруппируйте фрейм данных на ID и преобразуйте цвет с помощью nunique, чтобы проверить, что ID имеет 2 уникальных цвета.
s = df[df['color'].isin(['Yellow', 'Green'])]
s.loc[s.groupby('ID')['color'].transform('nunique').eq(2), 'ID']
Результат
0 1
2 1
14 8
15 8
Name: ID, dtype: int64
Обновление в соответствии с новыми требованиями, здесь я предполагаю, что df1 - это входной фрейм данных, полученный после groupby:
s = pd.DataFrame([*df1['color']])
df1[s.mask(~s.isin(['Yellow', 'Green'])).nunique(1).eq(2)]
Результат:
ID color
0 1 [Yellow, Red, Green]
7 8 [Green, Yellow]
Есть ли способ сделать это через групповой список?
Я хотел бы проверить наличие элемента в списке, а затем выбрать идентификатор
проголосовал за вашу помощь как всегда
Не уверен, что понял, но вы ищете: df[df['color'].isin(['Yellow', 'Green'])].groupby('ID')['color'].agg(list)
нет. Может быть, вы можете рассматривать мой входной фрейм данных как нечто, что вы видите после оператора groupby, который я написал в посте. В этом случае нам нужно проверить наличие элемента в списке, а затем выбрать идентификатор
@TheGreat Я обновил ответ.
Из вашего входного фрейма данных вы можете использовать:
colors = ['Yellow', 'Green']
out = df[df['color'].apply(lambda x: set(x).issuperset(colors))]
print(out)
# Output
ID color
0 1 [Yellow, Red, Green]
7 8 [Green, Yellow]
Я хочу подмножить этот фрейм данных через список групп (вместо прямого подмножества с использованием фильтра)