Python 从字符串中删除以分号分隔的重复子字符串

Python 从字符串中删除以分号分隔的重复子字符串,python,pandas,duplicates,Python,Pandas,Duplicates,我有一个excel文件,其中一列有字符串。我试图删除由分号和空格(“;”)分隔的重复子字符串。但是代码抛出错误。输入和输出要求如下: 输入 印度布巴内斯瓦尔ABC公司;印度布巴内斯瓦尔国防部;印度布巴内斯瓦尔ABC公司 印度布巴内斯瓦尔GHR;印度布巴内斯瓦尔ABC公司 印度布巴内斯瓦尔国防部;印度布巴内斯瓦尔国防部 印度布巴内斯瓦尔GHR 输出 印度布巴内斯瓦尔ABC公司;印度布巴内斯瓦尔国防部 印度布巴内斯瓦尔GHR;印度布巴内斯瓦尔ABC公司 印度布巴内斯瓦尔国防部 印度布巴内斯瓦尔GHR

我有一个excel文件,其中一列有字符串。我试图删除由分号和空格(“;”)分隔的重复子字符串。但是代码抛出错误。输入和输出要求如下:

输入

印度布巴内斯瓦尔ABC公司;印度布巴内斯瓦尔国防部;印度布巴内斯瓦尔ABC公司
印度布巴内斯瓦尔GHR;印度布巴内斯瓦尔ABC公司
印度布巴内斯瓦尔国防部;印度布巴内斯瓦尔国防部
印度布巴内斯瓦尔GHR

输出

印度布巴内斯瓦尔ABC公司;印度布巴内斯瓦尔国防部
印度布巴内斯瓦尔GHR;印度布巴内斯瓦尔ABC公司
印度布巴内斯瓦尔国防部
印度布巴内斯瓦尔GHR


假设您的输入中有4行感兴趣的列中的字符串。可以按如下方式删除重复的子字符串:

>>将熊猫作为pd导入
>>>df=pd.数据帧({'Dummy':['a','b','c','d'],'RepStr':['ABC,布巴内斯瓦尔,印度;DEF,布巴内斯瓦尔,印度;ABC,布巴内斯瓦尔,印度,'GHR,布巴内斯瓦尔;ABC,布巴内斯瓦尔,印度,'DEF,布巴内斯瓦尔,印度;DEF,布巴内斯瓦尔,印度,'GHR,布巴内斯瓦尔,印度']))
>>>
>>>使用pd.option\u上下文(
…“display.width”,无,
…“display.max_columns”,无,
…“display.max_colwidth”,-1,
…'display.colheader_justify','left'):
...     打印(df)
... 
伪RepStr
印度布巴内斯瓦尔ABC公司;印度布巴内斯瓦尔国防部;美国广播公司,布巴内斯瓦尔,印度
1 b印度布巴内斯瓦尔GHR;美国广播公司,布巴内斯瓦尔,印度
2 c DEF,布巴内斯瓦尔,印度;印度布巴内斯瓦尔国防部
印度布巴内斯瓦尔3D GHR
>>>
>>>df['RepStr']=df['RepStr'].apply(lambda x:';').join(dict.fromkeys((x.split(';'))))))
>>>
>>>使用pd.option\u上下文(
…“display.width”,无,
…“display.max_columns”,无,
…“display.max_colwidth”,-1,
…'display.colheader_justify','left'):
...     打印(df)
... 
伪RepStr
印度布巴内斯瓦尔ABC公司;印度布巴内斯瓦尔国防部
1 b印度布巴内斯瓦尔GHR;美国广播公司,布巴内斯瓦尔,印度
2 c DEF,布巴内斯瓦尔,印度
印度布巴内斯瓦尔3D GHR
需要注意的几点:

  • 我使用了
    dict.fromkeys()
    而不是
    set()
    ,因为Python 3.6及更高版本中的dict.fromkeys()尊重插入顺序,而后者不尊重插入顺序。如果不关心子字符串的顺序,可以使用
    set()
    。此外,如果您的Python版本不是3.6和以上,并且子串的顺序很重要,您可能需要考虑<代码> OrdEddit < /C> >
  • 您的输入示例仍然存在一些使字符串不同的问题,例如,第一行的注释
    ABC,Bhubaneswar,India
    不是
    ABC,Bhubaneswar,India
    (后者中缺少空格)。从您的输出示例中,我假设您希望它们是相同的字符串
  • 带有的
    块不会向解决方案添加任何内容。我包括它只是为了说明的目的;使行适合屏幕

稍作修改后,我的以下代码工作正常:

import pandas as pd
pipe_data = pd.read_excel('/content/sample_data/aff.xlsx', sheet_name='Sheet2')
df = pd.DataFrame(pipe_data)
df.dropna(inplace = True)
df['RepStr'] = df['RepStr'].str.split("; ")
df['RepStr'] = df['RepStr'].map(pd.unique).str.join("; ")
with pd.ExcelWriter('/content/sample_data/aff.xlsx', mode='a') as writer:
  df.to_excel(writer, sheet_name='Sheet3')

你面临的错误是什么?我觉得你的代码很好。
--->6 df['RepStr']=df['RepStr'].apply(lambda x:set(map(str.strip,x)))
TypeError:'float'对象不可编辑输入、输出或描述有点奇怪。在
“;”
处拆分输入将产生5个不同的字符串,即
1。美国广播公司,布巴内斯瓦尔,印度,2。布巴内斯瓦尔,印度ABC,布巴内斯瓦尔,印度,3。GHR,布巴内斯瓦尔,印度,4。ABC,布巴内斯瓦尔,印度DEF,布巴内斯瓦尔,印度和5。DEF,布巴内斯瓦尔,印度GHR,布巴内斯瓦尔,印度
。没有重复的。这不是错误的原因,但是为了帮助你,你需要知道你在寻找什么。你能检查一下你的输入和期望的输出(和描述)吗?
df['RepStr']
是否具有非
str
s,例如
float
s?子字符串(以及组成子字符串的单词)的顺序是否也很重要?如果是,在输入、输出、两者中?@NikolaosChatzis请再次检查输入和输出。因为我没有包括
,所以之前有些混乱。我需要“子字符串的顺序”,它抛出了一个错误“'float'对象不可替代”,因为输入来自excel文件。在何处包含“for循环”,以便它可以逐个单元读取和写入
import pandas as pd
pipe_data = pd.read_excel('/content/sample_data/aff.xlsx', sheet_name='Sheet2')
df = pd.DataFrame(pipe_data)
df.dropna(inplace = True)
df['RepStr'] = df['RepStr'].str.split("; ")
df['RepStr'] = df['RepStr'].map(pd.unique).str.join("; ")
with pd.ExcelWriter('/content/sample_data/aff.xlsx', mode='a') as writer:
  df.to_excel(writer, sheet_name='Sheet3')