Сравнение двух столбцов в pandas фрейме данных и разница результатов - PullRequest
1 голос
/ 05 мая 2020

Я сравниваю содержимое двух листов Excel, которые я превратил в кадр данных pandas и поместил столбцы рядом друг с другом.

Я создал код, который сравнивает два столбца и дает вывод ниже, но некоторые строки содержат большое количество текста, поэтому я хотел бы показать только разницу.

+---------------------+-------------------------+---------------------------------------------+
|         Old         |           New           |                   Changes                   |
+---------------------+-------------------------+---------------------------------------------+
| Apple, Egg, Ham     | Apple, Egg, Norway, Ham | Apple, Egg, Ham --> Apple, Egg, Norway, Ham |
| Instagram, Facebook | Instagram, Twitter      | Instagram, Facebook --> Instagram, Twitter  |
+---------------------+-------------------------+---------------------------------------------+

Оптимальный результат будет выглядеть примерно так:

+---------------------+-------------------------+---------------------+
|         Old         |           New           |       Changes       |
+---------------------+-------------------------+---------------------+
| Apple, Egg, Ham     | Apple, Egg, Norway, Ham | +Norway             |
| Instagram, Facebook | Instagram, Twitter      | +Twitter, -Facebook |
+---------------------+-------------------------+---------------------+

Норвегия была добавлена ​​в строку 1, Twitter был добавлен в строку 2, а Facebook был удален из строки 2.

Как я могу решить эту проблему?

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Вот как я буду go:

def find_diff(x):
    more = set(x.New.split(",")) - set(x.Old.split(","))
    less = set(x.Old.split(",")) - set(x.New.split(","))

    result = " ".join([f"+{x}" for x in more]) +", " + " ".join([f"-{x}" for x in less])
    return result

df.apply(find_diff, axis=1)
1 голос
/ 05 мая 2020

Преобразуйте значения в наборы, а затем используйте их разницу, также добавьте + и - в f-string s и соедините , на последнем шаге:

def f(x):
    old, new = set(x['Old'].split(', ')), set(x['New'].split(', '))
    d = old.difference(new)
    e = new.difference(old)
    return ', '.join([f'+{y}' for y in e] + [f'-{y}' for y in d])


df['Changes'] = df.apply(f, axis=1)
print (df)
                   Old                      New              Changes
0      Apple, Egg, Ham  Apple, Egg, Norway, Ham              +Norway
1  Instagram, Facebook       Instagram, Twitter  +Twitter, -Facebook
...