python - 删除复杂的重复列表
问题描述
我有一个奇怪的原始数据,其中包含不同方式和长度的多个名称。就像是:
data = [
'apple',
'apple;apple(big)',
'apple(apple),apple',
'banana(banana)',
'banana',
nan, # yes, there is some nan datas.
'cookie;cookie(cookie)',
'cookie(choco)']
在演示案例中,所需的输出是最短的有效名称,output = ['apple', 'banana', 'cookie']
我考虑的方式是声明一个output =[]
并遍历数据并比较输出中是否存在元素,如果不存在,则追加输出;如果存在,则比较两者是否相似并返回长度较小的一个。但这似乎效率很低,我不知道如何比较并获得最小的有效值。
我也尝试了正则表达式,但它失败了,因为有效结果也是随机放置的。我如何完成任务?
解决方案
假设:来自 pandas 的 DataFrame 或 Series 的数据
偶然发现评论nan
表明您的数据源是“数据框的元素”。所以我假设你也可以使用pandas。
脚步
- 删除 NaN 并重新索引(仅适用于 pandas)
- 清理数据:例如 'cookie;cookie(cookie)' 到 'cookie,cookie'
- 用逗号分隔并分解(添加为行):例如 'cookie,cookie' 以分隔行 ['cookie', 'cookie']
集成到 pandas 的解决方案
为简单起见,数据被定义为Series
(一维列表)。
import pandas as pd
import numpy as np # to inject NaN values
s = pd.Series([
'apple',
'apple;apple(big)',
'apple(apple),apple',
'banana(banana)',
'banana',
np.nan, # fixed the syntax
'cookie;cookie(cookie)',
'cookie(choco)'
])
unique = (
s.dropna() # remove the NaN values
.reset_index(drop=True) # adjust the index as if NaN never existed
.str.replace(r'\(.*[^)]?', '') # replace parentheses-enclosed (incl. half-open) by empty string"
.str.replace(r'[;.]', ',') # replace semicolon or period by comma
.str.split(',').explode() # split to rows (add possible duplicate elements)
.unique() # reduce to unique
)
print(type(unique))
print(unique)
印刷:
<class 'numpy.ndarray'> ['apple' 'banana' 'cookie']
看
- pandas 用户指南:处理文本数据
- 在熊猫数据框中将单元格拆分为多行
推荐阅读
- r - 在R中使用for循环构建时如何引用列中的先前条目?
- azure - 尝试在管道中使用 Azure Key Vault 任务时出错。未找到包裹
- r - 在 Rniftyreg 中成功使用 applyTransform()
- node.js - 尽管 npm install,Gatsby 还是找不到 fs
- c# - 为什么当我尝试从 TinyMCE 保存文本时模型无效
- javascript - 谷歌饼图“无数据”如何从 php 输出 json 获取数据
- ios - 正确使用/构建 IOS 框架的问题
- python - flask 和 flask-wtf - 先前提交的表单出错
- java - Java - 是否可以在字符变量中存储像点这样的元字符?
- android - MotionLayout 结合 NavHostFragment