Python 如何删除数据框列中与另一列中的字匹配的字

Python 如何删除数据框列中与另一列中的字匹配的字,python,pandas,replace,Python,Pandas,Replace,我试图删除pandas数据框列中的字符串的一部分,这些字符串在另一列中存在(匹配),这些值用逗号分隔,可以是一个或多个。我想用字符串的剩余部分创建一个新列。以下是迄今为止可复制的示例和我的代码: import pandas as pd df = pd.DataFrame({ 'Country' : ['Germany, France, Brazil, India, Russia','Russia, France, Jamaica, India, China',

我试图删除pandas数据框列中的字符串的一部分,这些字符串在另一列中存在(匹配),这些值用逗号分隔,可以是一个或多个。我想用字符串的剩余部分创建一个新列。以下是迄今为止可复制的示例和我的代码:

import pandas as pd

df = pd.DataFrame({
    'Country' : ['Germany, France, Brazil, India, Russia','Russia, France, 
   Jamaica, India, China',
                 'Germany, Russia, Jamaica','Italy, Jamaica'],
    'Exclude' : ['France, Brazil','India, Russia','Jamaica','Italy']})

print(df)
打印数据框:

                                  Country         Exclude
0  Germany, France, Brazil, India, Russia  France, Brazil
1   Russia, France, Jamaica, India, China   India, Russia
2                Germany, Russia, Jamaica         Jamaica
3                          Italy, Jamaica           Italy
我想创建“Output”列,其中包含“Exclude”列中不存在的国家的名称。所以我试着:

df['Output'] = df['Country'].replace(to_replace=r'\b'+df['Exclude']+r'\b', 
value='',regex=True)
期望输出:

Country                                    Exclude              Output
0  Germany, France, Brazil, India, Russia  France, Brazil       Germany, India, Russia
1  Russia, France, Jamaica, India, China   India, Russia        France, Jamaica, China
2  Germany, Russia, Jamaica                Jamaica              Germany, Russia 
3  Italy, Jamaica                          Italy                Jamaica
它完成了一半的工作,就像当“排除”列中的文本正好出现在“国家”中时匹配,但当顺序与“排除”列中的顺序不同时不起作用。例如,它在第二行上不起作用。 在发布问题之前,我花了很多时间,尝试了一些其他方法,我发现类似的问题,但在这种情况下它们没有帮助。
请提供帮助。

使用
设置每行拆分值的差异
,并应用

f=lambda x: ', '.join(set(x['Country'].split(', ')).difference(set(x['Exclude'].split(', '))))
df['Out'] = df.apply(f, axis=1)
或使用
zip
进行列表理解:

df['Out'] = ([', '.join(set(a.split(', ')).difference(set(b.split(', ')))) 
                  for a, b in zip(df['Country'], df['Exclude'])])

如果订单很重要:

df['Out'] = [', '.join(x for x in a.split(', ') if x not in set(b.split(', '))) 
                    for a, b in zip(df['Country'], df['Exclude'])]
print (df)
                                  Country         Exclude  \
0  Germany, France, Brazil, India, Russia  France, Brazil   
1   Russia, France, Jamaica, India, China   India, Russia   
2                Germany, Russia, Jamaica         Jamaica   
3                          Italy, Jamaica           Italy   

                      Out  
0  Germany, India, Russia  
1  France, Jamaica, China  
2         Germany, Russia  
3                 Jamaica  

令人惊叹的!!!,工作起来很有魅力,谢谢,这正是所需要的。除了格式是个人的选择(虽然我确实认为它比目前的:p更可读)-你不需要将
b.split()
转换为
set.difference
接受任何可替换项,例如:
df['Out'] = [', '.join(x for x in a.split(', ') if x not in set(b.split(', '))) 
                    for a, b in zip(df['Country'], df['Exclude'])]
print (df)
                                  Country         Exclude  \
0  Germany, France, Brazil, India, Russia  France, Brazil   
1   Russia, France, Jamaica, India, China   India, Russia   
2                Germany, Russia, Jamaica         Jamaica   
3                          Italy, Jamaica           Italy   

                      Out  
0  Germany, India, Russia  
1  France, Jamaica, China  
2         Germany, Russia  
3                 Jamaica