2017-06-28 23 views
5

Posiadam pandową ramkę danych o współrzędnych pojazdu (z wielu pojazdów w ciągu wielu dni). Dla każdego pojazdu i każdego dnia robię dwie rzeczy: albo zastosuj do niego algorytm, albo odfiltruj go całkowicie z zestawu danych, jeśli nie spełnia pewnych kryteriów.Przetwarzanie danych pandy w stylu deklaratywnym

Do tego używam df.groupby('vehicle_id', 'day') a następnie .apply(algorithm) lub .filter(condition) acheive gdzie algorithm i condition są funkcjami, które odbywają się w dataframe.

Chciałbym pełną przetwarzanie moich zbioru danych (która obejmuje wiele .apply i .filter etapy) mają być rozpisane w declaritive stylu, w przeciwieństwie do bezwzględnie zapętlenie za pośrednictwem grup, z celem całość aby wyglądał jak:

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

oczywiście, powyższy kod jest nieprawidłowy, ponieważ .apply() i .filter() powrócić nowych dataframes, i to jest właśnie mój problem. Zwracają wszystkie dane z powrotem w pojedynczej ramce danych i stwierdzam, że ciągle aplikuję .groupby('vehicle_id', 'day').

Czy istnieje dobry sposób na napisanie tego bez konieczności grupowania według tych samych kolumn w kółko?

Odpowiedz

0

Od apply używa pętli for w każdym razie (czyli nie ma żadnych wyrafinowanych optymalizacje w tle), proponuję zastosowanie rzeczywistej pętli for:

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) 

Alternatywą jest stworzenie funkcji, która uruchamia wszystkie dotyczy i filtruje się kolejno na danym dataframe, a następnie zmapować pojedynczy GroupBy/odnoszą się do niego:

def all_operations(dfg): 
    # Do stuff 
    return result_df 

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

w obu opcji będzie można mieć do czynienia z przypadkami, w których pusty dataframe jest zwracany z filtrami, jeśli takie sprawy istnieją.