在Python中从csv列中检索每个唯一值的第一次出现的更有效的方法
我得到的一个大csv有一个很大的飞行数据表。我编写了一个函数来帮助解析它,该函数遍历航班ID的列,然后返回一个字典,其中包含每个唯一航班ID的索引和值,按首次出现的顺序排列 字典={索引:FID,…} 这是对旧函数的快速调整,该函数不需要担心列中的FID重复(几十万行之后…) 现在,我让它迭代并按顺序比较每个值。如果一个值等于它后面的值,它将跳过它。如果下一个值不同,它会将该值存储在字典中。我将其更改为“现在也检查该值以前是否已出现”,如果已出现,则跳过该值。在Python中从csv列中检索每个唯一值的第一次出现的更有效的方法,python,algorithm,iteration,Python,Algorithm,Iteration,我得到的一个大csv有一个很大的飞行数据表。我编写了一个函数来帮助解析它,该函数遍历航班ID的列,然后返回一个字典,其中包含每个唯一航班ID的索引和值,按首次出现的顺序排列 字典={索引:FID,…} 这是对旧函数的快速调整,该函数不需要担心列中的FID重复(几十万行之后…) 现在,我让它迭代并按顺序比较每个值。如果一个值等于它后面的值,它将跳过它。如果下一个值不同,它会将该值存储在字典中。我将其更改为“现在也检查该值以前是否已出现”,如果已出现,则跳过该值。 这是我的密码: def Disco
这是我的密码:
def DiscoverEarliestIndex(self, number):
finaldata = {}
columnvalues = self.column(number)
columnenum = {}
for a, b in enumerate(columnvalues):
columnenum[a] = b
i = 0
while i < (len(columnvalues) - 1):
next = columnenum[i+1]
if columnvalues[i] == next:
i += 1
else:
if next in finaldata.values():
i += 1
continue
else:
finaldata[i+1]= next
i += 1
else:
return finaldata
def DiscoverEarliestIndex(self,number):
最终数据={}
columnvalues=self.column(数字)
columnenum={}
对于枚举中的a、b(列值):
列枚举[a]=b
i=0
而i<(len(columnvalues)-1):
下一步=列枚举[i+1]
如果columnvalues[i]==下一步:
i+=1
其他:
如果finaldata.values()中的下一个:
i+=1
继续
其他:
最终数据[i+1]=下一个
i+=1
其他:
返回最终数据
它的效率很低,而且随着字典的增长速度也会减慢。该列有520万行,因此使用Python处理这么多显然不是一个好主意,但我现在仍坚持使用它
有没有更有效的方法来编写此函数?您实际上是在寻找一个数据库。数据库正是为大型数据集上的此类操作而创建的。一次使用解析整个CSV并将其发送到数据库中要比将其存储在dict中并对整个dict运行检查快得多
您实际上是在寻找一个数据库。数据库正是为大型数据集上的此类操作而创建的。一次使用解析整个CSV并将其发送到数据库中要比将其存储在dict中并对整个dict运行检查快得多
要直接回答您的问题,您应该能够通过dict理解和itertools模块来完成
>>> import itertools as it
>>> data = {1: 'a', 2: 'a', 3: 'c', 4: 'c', 5:'d' }
>>> grouped_shit = {k: list(v) for (k,v) in it.groupby(data.iteritems(), lambda (_,v): v)}
>>> good_shit = {v[0][0]: k for (k, v) in grouped_shit.iteritems()}
>>> good_shit
{1: 'a', 3: 'c', 5: 'd'}
我觉得这有点夸张--我不太乐意把这篇文章翻两遍。但无论如何,我认为听写理解是相当有效的。此外,
groupby
假设您的键是有序的,也就是说,它假设所有的“a”索引都被分组在一起,这在您的情况下似乎是正确的。要直接回答您的问题,您应该能够通过dict理解和itertools模块来实现这一点
>>> import itertools as it
>>> data = {1: 'a', 2: 'a', 3: 'c', 4: 'c', 5:'d' }
>>> grouped_shit = {k: list(v) for (k,v) in it.groupby(data.iteritems(), lambda (_,v): v)}
>>> good_shit = {v[0][0]: k for (k, v) in grouped_shit.iteritems()}
>>> good_shit
{1: 'a', 3: 'c', 5: 'd'}
if next in thegoodshit.values():
我觉得这有点夸张--我不太乐意把这篇文章翻两遍。但无论如何,我认为听写理解是相当有效的。而且,groupby
假定您的键是有序的,也就是说,它假定所有的'a'索引都被分组在一起,这在您的情况下似乎是正确的
if next in thegoodshit.values():
可能是你的问题你在这里做的是什么
集合
来保存值并搜索该值-如下所示:
while i < (len(columnvalues) - 1):
next = columnenum[i+1]
if columnvalues[i] == next:
i += 1
else:
if next in searchable_data:
i += 1
continue
else:
finaldata[i+1]= next
searchable_data.add(next)
i += 1
else:
return finaldata
而i<(len(columnvalues)-1):
下一步=列枚举[i+1]
如果columnvalues[i]==下一步:
i+=1
其他:
如果在可搜索的_数据中出现下一个:
i+=1
继续
其他:
最终数据[i+1]=下一个
可搜索的_数据。添加(下一步)
i+=1
其他:
返回最终数据
可能是你的问题你在这里做的是什么
集合
来保存值并搜索该值-如下所示:
while i < (len(columnvalues) - 1):
next = columnenum[i+1]
if columnvalues[i] == next:
i += 1
else:
if next in searchable_data:
i += 1
continue
else:
finaldata[i+1]= next
searchable_data.add(next)
i += 1
else:
return finaldata
而i<(len(columnvalues)-1):
下一步=列枚举[i+1]
如果columnvalues[i]==下一步: