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