Pythonic增加列表列表的方法

RDS*_*RDS 8 python list nested-lists

我有一个大文件(2GB)的分类数据(大多数是"Nan" - 但在这里和那里填充了实际值)太大而无法读入单个数据帧.我有一个相当困难的时间想出一个对象来存储每列的所有唯一值(这是我的目标 - 最终我需要将其分解为建模)

我最后做的是将文件以块的形式读入数据帧,然后获取每列的唯一值并将它们存储在列表列表中.我的解决方案的工作,但似乎大多数非Python的 - 有没有在Python做到这一点(版本3.5)一个更清洁的方式.我知道列数(~2100).

import pandas as pd
#large file of csv separated text data
data=pd.read_csv("./myratherlargefile.csv",chunksize=100000, dtype=str)

collist=[]
master=[]
i=0
initialize=0
for chunk in data:
    #so the first time through I have to make the "master" list
    if initialize==0:
        for col in chunk:
            #thinking about this, i should have just dropped this col
            if col=='Id':
                continue
            else:
                #use pd.unique as a build in solution to get unique values
                collist=chunk[col][chunk[col].notnull()].unique().tolist()
                master.append(collist)
                i=i+1
    #but after first loop just append to the master-list at
    #each master-list element
    if initialize==1:
        for col in chunk:
            if col=='Id':
                continue
            else:
                collist=chunk[col][chunk[col].notnull()].unique().tolist()
                for item in collist:
                    master[i]=master[i]+collist
                i=i+1
    initialize=1
    i=0 
Run Code Online (Sandbox Code Playgroud)

之后,我对所有唯一值的最终任务如下:

i=0
names=chunk.columns.tolist()
for item in master:
     master[i]=list(set(item))
     master[i]=master[i].append(names[i+1])
     i=i+1
Run Code Online (Sandbox Code Playgroud)

因此master [i]给我列名称,然后是一个唯一值列表 - 粗略但它确实有效 - 我主要担心的是如果可能的话,以"更好"的方式构建列表.

Ami*_*ory 8

我建议,而不是一个listlistS,使用collections.defaultdict(set).

假设你开始

uniques = collections.defaultdict(set)
Run Code Online (Sandbox Code Playgroud)

现在循环可以变成这样:

for chunk in data: 
    for col in chunk:
        uniques[col] = uniques[col].union(chunk[col].unique())
Run Code Online (Sandbox Code Playgroud)

注意:

  1. defaultdict总是有一个setfor uniques[col](这就是它的用途),所以你可以跳过initialized它.

  2. 对于给定的col,您只需使用当前集合(最初为空,但无关紧要)和新的唯一元素更新条目.

编辑

正如Raymond Hettinger所说(谢谢!),最好使用它

       uniques[col].update(chunk[col].unique())
Run Code Online (Sandbox Code Playgroud)