Python 从字符串中删除以分号分隔的重复子字符串
我有一个excel文件,其中一列有字符串。我试图删除由分号和空格(“;”)分隔的重复子字符串。但是代码抛出错误。输入和输出要求如下: 输入 印度布巴内斯瓦尔ABC公司;印度布巴内斯瓦尔国防部;印度布巴内斯瓦尔ABC公司Python 从字符串中删除以分号分隔的重复子字符串,python,pandas,duplicates,Python,Pandas,Duplicates,我有一个excel文件,其中一列有字符串。我试图删除由分号和空格(“;”)分隔的重复子字符串。但是代码抛出错误。输入和输出要求如下: 输入 印度布巴内斯瓦尔ABC公司;印度布巴内斯瓦尔国防部;印度布巴内斯瓦尔ABC公司 印度布巴内斯瓦尔GHR;印度布巴内斯瓦尔ABC公司 印度布巴内斯瓦尔国防部;印度布巴内斯瓦尔国防部 印度布巴内斯瓦尔GHR 输出 印度布巴内斯瓦尔ABC公司;印度布巴内斯瓦尔国防部 印度布巴内斯瓦尔GHR;印度布巴内斯瓦尔ABC公司 印度布巴内斯瓦尔国防部 印度布巴内斯瓦尔GHR
印度布巴内斯瓦尔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()
,因为Python 3.6及更高版本中的dict.fromkeys()尊重插入顺序,而后者不尊重插入顺序。如果不关心子字符串的顺序,可以使用set()
。此外,如果您的Python版本不是3.6和以上,并且子串的顺序很重要,您可能需要考虑<代码> OrdEddit < /C> >set()
。
- 您的输入示例仍然存在一些使字符串不同的问题,例如,第一行的注释
不是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')