Найти подходящие строки на основе условной группировки в кадре данных pandas - PullRequest
1 голос
/ 05 июня 2019

Я везде ищу этот ответ, но, похоже, никто не делает то, что мне нужно. Вот фиктивный пример того, что мне нужно:

data = {'id':[1, 2, 3, 4, 1, 1, 3, 4, 1], 
        'parent':['a', 'b', 'f', 'j', 'a', 'n', 'f', 'z', 'x'], 
        'vehicle':['car', 'car', 'truck', 'suv', 'car', 'hatch', 'truck', 'suv', 'car'], 
        'color':['red', 'blue', 'grey', 'green', 'red', 'purple', 'grey', 'green', 'red'],
        'serial': [324234, 23464, 5667, 1245, 786, 34546, 8537, 111111, 8376251537]}
df = pd.DataFrame(data)
df.sort_values(by=['id', 'parent'], inplace=True)

    id  parent  vehicle   color   serial
0   1   a        car      red     324234
4   1   a        car      red     786
5   1   n        hatch    purple  34546
8   1   x        car      red     8376251537
1   2   b        car      blue    23464
2   3   f        truck    grey    5667
6   3   f        truck    grey    8537
3   4   j        suv      green   1245
7   4   z        suv      green   111111

И что мне нужно, так это получить все строки с одинаковым идентификатором , но родительский элемент отличается , а цвет и транспортное средство совпадают.


Итак, я хочу:

    id  parent  vehicle color   serial
0   1   a       car     red     324234
4   1   a       car     red     786
8   1   x       car     red     8376251537
3   4   j       suv     green   1245
7   4   z       suv     green   111111

Обратите внимание, что я хочу включить две верхние из вышеперечисленного, потому что они имеют другой серийный номер. Редактировать: , и они являются частью группы, которая имеет различного родителя с одинаковым идентификатором.


Я попробовал это и приблизился:

target = df[df.duplicated(['id', 'vehicle', 'color'], keep=False)]

    id  parent  vehicle   color   serial
0   1   a       car       red     324234
4   1   a       car       red     786
8   1   x       car       red     8376251537
2   3   f       truck     grey    5667
6   3   f       truck     grey    8537
3   4   j       suv       green   1245
7   4   z       suv       green   111111

Но я не хочу, чтобы строки с одинаковым идентификатором, транспортным средством, цветом i f соответствовали родительскому элементу . Так что в этом случае я не хочу

    id  parent  vehicle   color   serial
2   3   f       truck     grey    5667
6   3   f       truck     grey    8537

потому что у них один и тот же родитель. Я думал о группировке и изменении индекса, но то, что я делаю, не работает. Это кажется легкой проблемой, и, возможно, это так, но я просто не могу ее взломать!

1 Ответ

3 голосов
/ 05 июня 2019

IIUC, попробуем так:

df[df.groupby(['id','vehicle','color'])['parent'].transform('nunique') > 1]

Вывод:

   id parent vehicle  color      serial
0   1      a     car    red      324234
4   1      a     car    red         786
8   1      x     car    red  8376251537
3   4      j     suv  green        1245
7   4      z     suv  green      111111
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...