2016-12-06 3 views
3

Ich habe einen Datenrahmen, der mehr als 10 Millionen Rohdaten aus etwa 30 Spalten zusammengesetzt hat.Wie wird ein Dataset im Pandas Dataframe subsettiert?

Die erste Spalte ist ID

ID C 
1 1 
1 2 
1 3 
1 2 
1 3 
2 1 
2 5 
2 9 
2 0 
2 1 

Ich möchte nur die ersten vier Zeilen jeder ID extrahieren (sie sind die neuesten Eingaben wie es bereits sortiert ist)

Ich bin derzeit mit der unter dem Code, aber leider ist es so langsam, da es ungefähr zwei Stunden dauert, um ungefähr 5% der Daten zu verarbeiten, und es kann ein Tag oder so dauern, die ganzen Daten zu verarbeiten.

df1 = pd.DataFrame() # an empty dataframe 
for i in df.ID: # df is the dataframe which contains the data 
    df2 = df[df["ID"]== i] 
    df2 = df2[0:4] # take the first four rows 
    df_f = df1.append(df2) 

Gibt es eine effektive Möglichkeit, das Gleiche in kürzerer Zeit zu tun.

+0

ist sichergestellt, dass es sind mindestens vier Instanzen jeder ID? – kiliantics

+0

Ja, es gibt mehr als 10 Instanzen für die meisten IDs und ich möchte nur Instanzen der letzten vier Monate abrufen und die Instanzen sind bereits in absteigender Reihenfolge für jede ID sortiert. –

Antwort

2

Sie benötigen die head() Methode:

df.groupby("ID").head(4) 

enter image description here

Hier ist eine überarbeitete Version des ursprünglichen Code mit Laufzeit-Tests gegen groupby().head() Methode:

def loop(): 
    df1 = pd.DataFrame() # an empty dataframe 
    for i in df.ID.drop_duplicates(): # df is the dataframe which contains the data 
     df2 = df[df["ID"]== i] 
     df2 = df2[0:4] # take the first four rows 
     df1 = pd.concat([df1, df2]) 
    return df1 

%timeit loop() 
# 100 loops, best of 3: 1.99 ms per loop 

%timeit df.groupby("ID").head(4) 
# 1000 loops, best of 3: 485 µs per loop 
+1

Ich habe Ihren Code: df.groupby ("ID"). Head (4) Es löst mein Problem, ohne eine Schleife zu verwenden. Vielen Dank. –