在Python中从csv列中检索每个唯一值的第一次出现的更有效的方法

2024-04-25 12:08:31 发布

您现在位置:Python中文网/ 问答频道 /正文

给我的一个大csv有一个很大的飞行数据表。我编写了一个函数来帮助解析它,它在flightid的列上迭代,然后返回一个字典,其中包含每个唯一航班ID的索引和值,按第一次出现的顺序排列。在

Dictionary={Index:FID。。。}在

这是对旧函数的快速调整,不需要担心列中的FID重复(几十万行之后…)。在

现在,我让它迭代并按顺序比较每个值。如果一个值等于它后面的值,它将跳过它。如果下一个值不同,它将该值存储在字典中。我将其更改为now还检查该值是否以前已出现过,如果是,则跳过它。
我的代码是:

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 

它的效率很低,而且随着词典的增长速度也变慢了。这个专栏有520万行,所以用Python处理这么多显然不是一个好主意,但我现在还是坚持使用它。在

有没有更有效的方法来编写这个函数?在


Tags: csv函数inselfnumberif字典else
3条回答
if next in thegoodshit.values():   

可能是你的问题你在这里做什么

  1. 创建列表
  2. 正在搜索列表

也许您可以使用set来保存这些值并搜索它-类似于:

^{pr2}$

为了直接回答您的问题,您应该能够通过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's索引被组合在一起,这在您的例子中似乎是正确的。在

你实际上是在寻找一个数据库。数据库正是为大型数据集上的此类操作而建立的。使用CSV module一次解析整个CSV并将它们发送到数据库中要比将它们存储在dict中并对整个dict运行检查要快得多

*large* python dictionary with persistence storage for quick look-ups

相关问题 更多 >