Как найти различия набора для строки в панде DataFrame? - PullRequest
2 голосов
/ 04 ноября 2019

У меня есть приведенный ниже DataFrame, содержащий списки фруктов:

import pandas as pd
df = pd.DataFrame(([['apple','pear'],['orange','grapes','apple']],
               [['pear', 'fig','raspberry'],['pineaple', 'raspberry']],
               [['mango'],['melon']]), columns = ['A','B'])

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

         A                      B
apple, pear              orange, grapes, apple
pear, fig, raspberry     pineapple raspberry
mango                    melon

Я прочитал несколько похожих вопросов без особой удачи. До сих пор я пробовал нижеследующее, которое, как я знаю, не работает, но, надеюсь, объясняет, что я пытаюсь сделать.

df['C'] = [[list(set(row)) in df['A'] - list(set(row)) in df['B']] for row in df]

Предполагаемый результат будет следующим:

C
pear
pear, fig
mango

Ответы [ 4 ]

5 голосов
/ 04 ноября 2019

Мы можем сделать

df.A.map(set)-df.B.map(set)
Out[343]: 
0         {pear}
1    {fig, pear}
2        {mango}
dtype: object
4 голосов
/ 04 ноября 2019

Это сделает трюк

df['C'] = df.apply(lambda x: set(x['A']).difference(x['B']), axis=1)
2 голосов
/ 04 ноября 2019

map

df.assign(C=[*map(lambda a, b: {*a} - {*b}, df.A, df.B)])

                        A                        B            C
0           [apple, pear]  [orange, grapes, apple]       {pear}
1  [pear, fig, raspberry]    [pineaple, raspberry]  {pear, fig}
2                 [mango]                  [melon]      {mango}

И без lambda

def f(a, b): return {*a} - {*b}
df.assign(C=[*map(f, df.A, df.B)])
2 голосов
/ 04 ноября 2019

Быстрое решение (с точки зрения кода, а не времени выполнения)

df['A'].apply(set) - df['B'].apply(set)

Вывод:

0         {pear}
1    {fig, pear}
2        {mango}
dtype: object
...