2017-06-28 78 views
5

Araç koordinatlarının (birden fazla araçtan birden fazla araçtan) pandalar veri çerçevem ​​var. Her araç için ve her gün için iki şey yapıyorum: ya bir algoritma uygulayın ya da belirli kriterleri karşılamıyorsa veri kümesinden tamamen filtreleyin. algorithm ve condition bir dataframe almak fonksiyonları olmak üzere Deklarasyon stilinde pandaların işlenmesi

ben df.groupby('vehicle_id', 'day') ve sonra .apply(algorithm) veya .filter(condition) kullanmak bu modernleşmek için.

Ben imperatively grupları aracılığıyla döngü aksine bir şey bakmak için her şeyi hedefiyle, bir declaritive tarzda dışarı yazılacak (birden .apply ve .filter adımdan oluşur) benim veri kümesi tam işlenmesini istiyorum gibi: tabii

df.group_by('vehicle_id', 'day').apply(algorithm1).filter(condition1).apply(algorithm2).filter(condition2)

, yukarıdaki kod .apply() beri yanlış ve yeni dataframes iade .filter() ve bu tam benim sorunudur. Tüm verileri tek bir veri alanına geri döndürüyorlar ve sürekli olarak .groupby('vehicle_id', 'day') uyguladığımı tespit ediyorum.

Aynı sütunlar üzerinde gruplama yapmadan bunu yazmanın güzel bir yolu var mı? apply yana

cevap

0

, ben döngü için gerçek bir kullanmanızı öneririz (arka planda hiçbir sofistike optimizasyonlar vardır anlamı) zaten döngü için kullanır:

alternatif tüm çalışan bir işlev yaratmaktır

arr = [] 
for key, dfg in df.groupby(['vehicle_id', 'day']): 
    dfg = dfg.do_stuff1() # Perform all needed operations 
    dfg = do_stuff2(dfg) # 
    arr.append(dfg) 

result = pd.concat(arr) 
uygular ve belirli dataframe üzerinde ardışık filtreler ve sonra da geçerli/tek GroupBy map: böyle eğer boş bir dataframe filtrelerinden geri getirildiği durumlarda uğraşmak zorunda olacak

def all_operations(dfg): 
    # Do stuff 
    return result_df 

result = df.group_by(['vehicle_id', 'day']).apply(all_operations) 

hem seçeneklerinde durumlar var.