Python: несколько фильтров сгруппированных данных - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь отфильтровать приведенный ниже список, чтобы показать только те позиции, которые имеют одного и того же поставщика, одинакового качества (может быть бесконечное количество оценок), но разного типа (будут только два разных значения).

Например, я мог бы использовать поставщик ABC A по рейтингу дерева или стали, но не смог бы сделать такой же переход с поставщиком DEF (учитывая, что дерево и сталь имеют разное качество). Желаемым результатом будет таблица, показывающая только сталь и дерево с рейтингом ABC A и сталь и дерево с рейтингом GHI B.

Я выяснил, как показывать только те материалы, которые предлагают как древесину, так и сталь (т.е. исключает JKL), но не могу понять, как дополнительно фильтровать, чтобы показывать поставщиков с другим типом, но одинаковым качеством.

df.groupby('Supplier').filter(lambda x:x['Type'].nunique()>1)

Любая помощь будет принята с благодарностью!

Входные данные:

  Supplier Quality   Type
0      ABC       A   Wood
1      ABC       B  Steel
2      ABC       A  Steel
3      DEF       B  Steel
4      DEF       A   Wood
5      GHI       C   Wood
6      GHI       A   Wood
7      GHI       A  Steel
8      JKL       A   Wood
9      JKL       A   Wood

Ответы [ 3 ]

0 голосов
/ 04 ноября 2018

Просто группируйте по поставщику и качеству:

df.groupby(['Supplier', 'Quality']).filter(lambda x: x['Type'].nunique() > 1)

  Supplier Quality   Type
0      ABC       A   Wood
2      ABC       A  Steel
6      GHI       A   Wood
7      GHI       A  Steel
0 голосов
/ 04 ноября 2018

Один из способов - использовать drop_duplicates и duplicated с keep=False:

key_cols = ['Supplier', 'Quality']

res = df.drop_duplicates().loc[:, key_cols]

res = res.loc[res.duplicated(keep=False)]\
         .drop_duplicates()

print(res)

  Supplier Quality
0      ABC       A
6      GHI       A
0 голосов
/ 04 ноября 2018

на основании того, что вы пробовали, вы ищете уникальные типы с кратностью 1, так что вы можете сделать что-то вроде этого:

df2 = df.groupby(['Supplier', 'Quality'])['Type'].unique().to_frame()
df2[df2['Type'].str.len() >1]


                       Type
Supplier    Quality 
ABC            A    [Wood, Steel]
GHI            A    [Wood, Steel]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...