2013-03-27 22 views
0

我有许多文件(〜2,000,000)由另一个需要从中提取数据的程序生成。这些文件共同指标对不同的方法,不同的价值,我不知道如何词组这个舒服,所以这里是一个三维的例子:使用大熊猫从许多文件创建大型数据库

[x1,y1,z1,method1] 
[x1,y1,z1,method2] 
[x2,y2,z2,method1] 
[x2,y2,z2,method2] 

最后,我想有什么是熊猫数据帧,看起来像这样:

x y z method1 method2 ... methodn 
0 x1 y1 z1  data  data  data 
1 x2 y2 z2  data  data  data 
2 x3 y3 z3  NaN  data  data 
3 x4 y4 z4  data  NaN  data 
... 
n xn yn zn  data  NaN  NaN 

该方法会有一些漏洞,并且数据未对齐。

下面显示的伪代码:

file_list=glob.glob('/scratch/project/*') 

method1_list=[] 
method2_list=[] 
... 
methodn_list=[] 

#Obtain data in the correct list 
for outfile in file_list: 
    indices=(#function that obtains indices) 
    data=(#function that obtains primary data) 

    if method1: method1_list.append([indices,data]) 
    elif method2: method2_list.append([indices,data]) 
    ... 
    else methodn: methodn_list.append([indices,data]) 

#Convert list to dataframe 
method1_pd=pd.DataFrame(method1_list,columns[indices,method1]) 
method2_pd=pd.DataFrame(method2_list,columns[indices,method1]) 
... 
methodn_pd=pd.DataFrame(methodn_list,columns[indices,method1]) 

#Apply multi index 
method1=method1.set_index(indices) 
method2=method2.set_index(indices) 
... 
methodn=methodn.set_index(indices) 

#Combine data  
out=method1.combine_first(method2) 
out=out.combine_first(method3) 
... 
out=out.combine_first(methodn) 

这个作品真的很好,然而由于这些方法的数量在不断增长,这正成为相当繁琐的编写和似乎相当unpythonic。所以,我有以下问题:

  • 有没有更好的方式来创建这样一个数据帧? for循环之后的所有东西都已经包装在一个定义中,但它在这里没有帮助可读性。我仍然必须说明每种方法三次。
  • 如果我想更新数据集,是否有一种简单的方法可以省略已读取的文件?
  • 有没有更好的方式来对齐熊猫这样的数据?
+2

几个问题:大约有多少方法[R有独特的,做你知道他们的先验,多少行总共是U期待,是U附加(如建筑物,然后添加数据明天再说),结局是什么这个框架的目标(例如查找表,计算)? – Jeff 2013-03-28 00:20:52

+0

我知道先验的方法(总共20-30),总共会有大约200,000行,最终目标是运行统计数据,生成数据集,并提供查找表。 – Daniel 2013-03-28 12:49:43

回答

1

虽然取决于数据的实际构造方式,但这样的东西可能会起作用。如果你能提供样品,可能会有所帮助。它假定你的指数是已知的(或计算 你去)

from collections import defaultdict 
file_list = glob.glob('/scratch/project/*') 

methods = defaultdict([]) 
for outfile in file_list: 
    #indices = (#function that obtains indices) 
    #data = (#function that obtains primary data) 

    methods[method].append([indices,data]) 

frames = [ DataFrame(method_list,columns[indices,method]) 
     for method, method_list in methods.items() ] 

# concat 
combine_frame = pd.concat(frames,axis=1) 

# set your combined index 
result = combine_frame.set_index(indicies) 
+0

数据将不会对齐,因此一个简单的concat将不够用。虽然如果您以这种方式创建帧,只需简单地通过设置索引和combine_first即可。我真的希望有一种简单的熊猫方式来做到这一点。 – Daniel 2013-03-28 13:24:02

+0

刚刚重新建立连接之前的帧,在这种情况下 – Jeff 2013-03-28 15:01:46

1

也许CONCAT每一个文件/帧,并从最终的数据帧创建数据透视表?

df1 = pd.read_csv(StringIO("""\ 
x,y,z,data 
x1,y1,z1,1 
x2,y2,z2,1 
"""), sep=',') 
df2 = pd.read_csv(StringIO("""\ 
x,y,z,data 
x1,y1,z1,2 
x2,y2,z2,2 
"""), sep=',') 
df3 = pd.read_csv(StringIO("""\ 
x,y,z,data 
x3,y2,z2,3 
"""), sep=',') 
df1['method'] = 'method1' 
df2['method'] = 'method2' 
df3['method'] = 'method3' 
df = pd.concat([df1, df2, df3]) 

In [17]: df.pivot_table(rows=['x', 'y', 'z'], cols='method', values='data', 
...      aggfunc='first') 
Out[17]: 
method method1 method2 method3 
x y z        
x1 y1 z1  1  2  NaN 
x2 y2 z2  1  2  NaN 
x3 y2 z2  NaN  NaN  3 

In [18]: df 
Out[18]: 
    x y z data method 
0 x1 y1 z1  1 method1 
1 x2 y2 z2  1 method1 
0 x1 y1 z1  2 method2 
1 x2 y2 z2  2 method2 
0 x3 y2 z2  3 method3 
+0

啊,pivot_table +1。我最终会使用这两个响应的混合体,但是defaultdict想法处理最紧迫的问题。 – Daniel 2013-03-28 16:01:57