2016-11-07 5 views
1

私は次のようなデータが含まれている非常に大規模なDFがありますので、私はチャンクに分割し、それを解析する必要があるサイズの可変チャンクサイズパンダDATAFRAME

import pandas as pd 
df = pd.DataFrame() 
df['CODE'] = [1,2,3,1,2,4,2,2,4,5] 
df["DATA"] = [ 'AA', 'BB', 'CC', 'DD', 'AA', 'BB', 'EE', 'FF','GG', 'HH'] 
df.sort_values('CODE') 
df 
    CODE DATA 
0  1 AA 
3  1 DD 
1  2 BB 
4  2 AA 
6  2 EE 
7  2 FF 
2  3 CC 
5  4 BB 
8  4 GG 
9  5 HH 

を。 しかし、CODE列に含まれるequals要素は、異なるチャンクで終わるべきではなく、サイズを超えても前のチャンクに追加されるべきです。私は4列のチャンクサイズを選択した場合

基本的には最初のチャンクは「2」を持つすべての要素を含むとするまで増加させることができた:

chunk1: 
     CODE DATA 
0  1 AA 
3  1 DD 
1  2 BB 
4  2 AA 
6  2 EE 
7  2 FF 

私は次のようにチャンクとのグループ化に関するいくつかの記事を見つけました:上記は、同じサイズのチャンクを提供し、私はCODE欄にアカウントに値をとるスマートチャンキングを必要とするしかし

split dataframe into multiple dataframes based on number of rows

どうすればいいですか?

答えて

0

私はおそらく解決策を思いつきました私は非常に優雅ではありません。

私が取るように間隔を返す再帰関数を作成します。

def findrange(start,step): 
     for i in range(start,len(df)+1, step): 
      if i+step > len(df): return [i, len(df)] 
      if df.CODE[i+step:i+step+1].values != df.CODE[i+step-1:i+step].values: 
       return [i,i+step] 
     else: 
      return findrange(i,step+1) 

は、それから私は、DFは多くを使用して掲載して私が試した範囲を取得し、データに

interval = [0,0] 
idx = 0 
N=2 
while interval[1] < len(df): 
    if idx < interval[1]: idx = interval[1] 
    interval = findrange(idx, N) 
    idx+=N # this point became useless once interval[1] > idx 

を処理するための関数を呼び出しますN> 0の異なる値であり、良好に見える。 私はそれに門戸を開いているように、もっとパンダのようなアプローチをとっていれば。

0

は、私はあなたがNによって、その後cumcountと床分裂によって新しい列GROUPSを作成することができると思います - 各CODE値のためのチャンクを取得:

N = 2 
df['GROUPS'] = df.groupby('CODE').cumcount() // N 
print (df) 
    CODE DATA GROUPS 
0  1 AA  0 
3  1 DD  0 
1  2 BB  0 
4  2 AA  0 
6  2 EE  1 
7  2 FF  1 
2  3 CC  0 
5  4 BB  0 
8  4 GG  0 
9  5 HH  0 

groups = df.groupby(['CODE','GROUPS']) 
for (frameno, frame) in groups: 
    print (frame.to_csv("%s.csv" % frameno)) 

あなたはまた、新しいSeriesを作成し、groupbyのためにそれを使用することができます。

chunked_ser = df.groupby('CODE').cumcount() // N 
print (chunked_ser) 
0 0 
3 0 
1 0 
4 0 
6 1 
7 1 
2 0 
5 0 
8 0 
9 0 
dtype: int64 

groups = df.groupby([df.CODE,chunked_ser]) 
for (frameno, frame) in groups: 
    print (frame.to_csv("%s.csv" % frameno)) 
+0

などですが、N = 2の場合は、CODEが2の行を分割することになります。代わりに、それらを同じチャンクに入れておきます。 – user2320577

+0

うーん、大きなグループのデータを扱うため、各グループを 'CODE'カラムで分割する必要があります。ですから、1000のような大きな 'N'を使うことができます。そして、1000行ずつ分割します。または私は何かが行方不明ですか? – jezrael

+0

例えばフロア分割を使用する場合。 'N = 3 'を試して、サイズ' 1'の最後のグループを取得してください。ほとんどのグループは同じ長さになりますが、最後のほうが小さくなります。 – jezrael

関連する問題