Удаление строк, если значения из столбца не соответствуют требованиям в другом столбце - PullRequest
0 голосов
/ 19 мая 2018

Допустим, у меня есть этот фрейм данных:

df = DataFrame({'ID': [1001,4003,1001, 4003, 7000, 7000], 
            'col_2': ['3', '8', '2', '1','7','9'], 
            'col_3': ['Steak','Chicken','Chicken','Steak','Chicken','Chicken']})

Я хочу создать 3 фрейма данных.Первые два будут фреймом данных для каждого идентификатора с Chicken.Второй будет для всех идентификаторов, которые имели говядину.Это достаточно просто:

dfsteak = df[~(df['col_3'] != 'Steak')]
dfchicken =  df[~(df['col_3'] != 'Chicken')]

Но для третьего я хочу отбросить любую строку, если у идентификатора нет Цыпленка один раз, а у Стейка другой.Так что в этом примере DF это будет ID 7000, который заказал только курицу.Но как мне это реализовать?

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Вот один интуитивный способ.Идея состоит в том, чтобы создать серию, агрегирующую col_3 в set по ID.

, а затем отфильтровать, когда отображенный set равен , а не надмножеству {'Steak', 'Chicken'}..

s = df.groupby('ID')['col_3'].apply(set)
df = df[~(df['ID'].map(s) >= {'Steak', 'Chicken'})]

print(df)

     ID col_2    col_3
4  7000     7  Chicken
5  7000     9  Chicken
0 голосов
/ 19 мая 2018

Использование filter с any

df.groupby('ID').filter(lambda x : ((x['col_3']=='Steak').any())&((x['col_3']=='Chicken').any()))
Out[14]: 
     ID col_2    col_3
0  1001     3    Steak
1  4003     8  Chicken
2  1001     2  Chicken
3  4003     1    Steak

Чтобы отфильтровать ID 7000

df.groupby('ID').filter(lambda x : ~((x['col_3']=='Steak').any())&((x['col_3']=='Chicken').any()))
Out[16]: 
     ID col_2    col_3
4  7000     7  Chicken
5  7000     9  Chicken
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...