Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中从csv列中检索每个唯一值的第一次出现的更有效的方法_Python_Algorithm_Iteration - Fatal编程技术网

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

在Python中从csv列中检索每个唯一值的第一次出现的更有效的方法,python,algorithm,iteration,Python,Algorithm,Iteration,我得到的一个大csv有一个很大的飞行数据表。我编写了一个函数来帮助解析它,该函数遍历航班ID的列,然后返回一个字典,其中包含每个唯一航班ID的索引和值,按首次出现的顺序排列 字典={索引:FID,…} 这是对旧函数的快速调整,该函数不需要担心列中的FID重复(几十万行之后…) 现在,我让它迭代并按顺序比较每个值。如果一个值等于它后面的值,它将跳过它。如果下一个值不同,它会将该值存储在字典中。我将其更改为“现在也检查该值以前是否已出现”,如果已出现,则跳过该值。 这是我的密码: def Disco

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

字典={索引:FID,…}

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

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

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]==下一步: