2016-03-29 6 views
2

内の行の未定数をマージ私はこのようになりますCSVファイルを持っています与えられたリスト。私のリストが['main', 'makea']ある場合たとえば、ファイナルテーブルには、次のようになります。DATAFRAME

tid || instr_count || fnname 
============================= 
22 ||  892806 || main 
22 ||   138 || makea 

私は多くのエントリが与えられたリストに2つの値の間になりますどのように事前に知っていない - それは以上であってもよいです圧縮されなければならない

tid || instr_count || fnname 
============================= 
22 ||  892806 || main 
22 ||   18 || randlc 
22 ||   7 || randlc 
22 ||   35 || randlc 
22 ||   20 || randlc 
22 ||   120 || makea 

:これに似

tid || instr_count || fnname 
============================= 
22 ||  892806 || main 
22 ||   200 || makea 

私はDataframe使ってパンダ0.17.1とPython 2.7.6にこれらの値をロードしました。ここでは、私がこれまで持っているものです。

def compressDataframes(df): 

    new_df = pd.DataFrame(columns=df.columns) 
    instr_count = 0 
    i = 0 
    for row in df.itertuples(): 
     instr_count += row[2] 
     if any(f in row[3] for f in FUNCS): #FUNCS is my "given list" 
      new_df.loc[i] = [row[1], instr_count, row[3]] 
      i += 1 
      instr_count = 0 

    return new_df 

これは動作しますが、私は(私はいくつかの非常に大規模な(> 10ギガバイト)のデータセットで働いている)より速くそれを行うための方法がなければならないと思います。誰にも何か提案はありますか?

答えて

1

私はあなたが最初のデータはありませんし、その後fillnaによってギャップ(埋め戻し)を埋めるために有効な観測を満たしているNaNを含む新しい列groupedを作成するためのboolean indexingisinを使用することができると思います。

li = ['main','makea'] 

df['grouped'] = df.loc[df['fnname'].isin(li), 'fnname'] 

df['grouped'] = df['grouped'].fillna(method='bfill') 

print df 
    tid instr_count fnname grouped 
0 22  892806 main main 
1 22   18 randlc makea 
2 22   120 makea makea 

print df.groupby(['tid','grouped'])['instr_count'].sum().reset_index() 
    tid grouped instr_count 
0 22 main  892806 
1 22 makea   138 

またはaggと::コラムinstr_countgroupby集計sumと最終

print df.groupby('grouped').agg({'tid':'first', 'instr_count': sum}).reset_index() 

    grouped tid instr_count 
0 main 22  892806 
1 makea 22   138 

第二のサンプル:ちょうど実現

li = ['main','makea'] 
df['grouped'] = df.loc[df['fnname'].isin(li), 'fnname'] 
df['grouped'] = df['grouped'].fillna(method='bfill') 

print df 
    tid instr_count fnname grouped 
0 22  892806 main main 
1 22   18 randlc makea 
2 22   7 randlc makea 
3 22   35 randlc makea 
4 22   20 randlc makea 
5 22   120 makea makea 

print df.groupby(['tid','grouped'])['instr_count'].sum().reset_index() 
    grouped tid instr_count 
0 main 22  892806 
1 makea 22   200 

print df.groupby('grouped').agg({'tid':'first', 'instr_count': sum}).reset_index() 
    tid grouped instr_count 
0 22 main  892806 
1 22 makea   200 
+0

- 私はこれが正しく動作するかどうかとは思わないI 'main、randlc、randlc、makea、makea'のようなものがあります。最初の 'makea'は2番目のグループにグループ化されますね。 – tonysdg

+0

はい、あなたは正しいです。 – jezrael

+0

行番号をグループ化された列にコピーすることは可能でしょうか?これにより、一意の識別子が作成され、埋め戻すことができます。 – tonysdg

関連する問題