2016-03-29 28 views
2

satırların belirsiz sayıda birleştirme ben şuna benzer bir CSV dosyası var verilen liste. Benim liste ['main', 'makea'] ise Örneğin, nihai tablo bu gibi görünmelidir:bir Dataframe

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

birçok girişler verilen listedeki 2 değerleri arasında nasıl olacağını önceden bilmek değil - bu yüzden fazla olabilir

aşağı sıkıştırılmış olmalıdır
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 

Ben Dataframe kullanarak pandalar 0.17.1 ve piton 2.7.6 bu değerleri yükledim bu benzer. İşte ben bugüne kadar ne var:

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 

Bu çalışır, ancak ben (Bazı çok büyük (> 10 GB) veri setleri ile çalışıyorum) daha hızlı yapmak için bir yolu olmalı şüpheli. Herhangi bir öneri var mı?

cevap

1

ben ilk boşluğu (dolgu) doldurmak için geçerli gözlem doldurulur fillna tarafından sonra da veri değildir ve NaN içeren yeni bir sütun grouped oluşturmak için boolean indexing ile isin kullanabiliriz.

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 

Veya agg ile: kolonunun instr_count ait groupby agrega sum ile Son

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

    grouped tid instr_count 
0 main 22  892806 
1 makea 22   138 

İkinci örnek: Hemen fark

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

- Bu düzgün çalışması eğer sanmıyorum ben ana, randlc, randlc, makea, makea gibi bir şey var. İlk "makea" ikinci grupta toplanacak, değil mi? – tonysdg

+0

Evet, haklısınız. – jezrael

+0

Satır numarasını gruplanmış sütuna kopyalamak mümkün mü? Bu, daha sonra tekrar doldurulabilen benzersiz bir tanımlayıcıyı yapar. – tonysdg