比较熊猫数据框中的两列和返回差异

问题描述 投票:1回答:2

我正在比较两个Excel工作表的内容,我已将它们转换为熊猫数据框并将各列彼此相邻。

我创建了一些比较两列并在下面提供输出的代码,但是某些字符串包含大量文本,所以我想显示only区别。

+---------------------+-------------------------+---------------------------------------------+
|         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行中添加了挪威,在第2行中添加了Twitter,并且从第2行中删除了Facebook。

我该如何解决?

python pandas compare string-comparison
2个回答
1
投票

将值转换为集合,然后使用它们的差,还要在+中添加-f-string,并在最后一步中按,进行连接:

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

1
投票

这是我要去的地方:

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)
© www.soinside.com 2019 - 2024. All rights reserved.