0

データを抽出する必要がある別のプログラムによって生成された多くのファイル (〜 2,000,000) があります。これらのファイルには、メソッドごとに異なる値を持つ共通のインデックスがあります。これをうまく表現する方法がわからないため、ここに 3 次元の例を示します。

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

最終的に欲しいのは、次のような pandas データフレームです。

    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)

これは非常にうまく機能しますが、メソッドの数が増えるにつれて、これを書くのはかなり面倒になり、Pythonらしくないように見えます。だから私は次の質問があります:

  • この方法で DataFrame を作成するより良い方法はありますか? for ループの後のすべては既に定義にラップされていますが、ここでは読みやすさには役立ちませんでした。各メソッドを 3 回述べる必要があります。
  • データセットを更新したい場合、既に読み取ったファイルを省略する簡単な方法はありますか?
  • この方法でパンダのデータを揃えるより良い方法はありますか?
4

2 に答える 2

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)
于 2013-03-28T13:14:07.300 に答える
1

おそらく、すべてのファイル/フレームを連結し、最終的な DataFrame からピボット テーブルを作成しますか?

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
于 2013-03-28T14:39:28.307 に答える