2016-06-10 11 views
3

würde Ich mag einige multidimensionalen Daten in einem Pandas Datenrahmen oder Platte speichern, so dass ich mag in der Lage sein, zum Beispiel zurückzukehren:Mehrdimensionale/Verschachtelte Datenrahmen/Datensatz/-Modulen in Pandas

  1. All Zeiten für Runner A, Rennen A
  2. die Zeiten alle (und Namen) für Race A für ein bestimmtes Jahr sagen 2015

Beispiel Daten wie folgt aussehen würde, beachten Sie, dass nicht alle Läufer Daten für alle haben wird Jahre oder alle Rassen.

Kann jemand einen guten Weg vorschlagen, dies mit Pandas oder auf andere Weise zu tun?

Name  | Gender | Age 
Runner A | Male | 35 
    Race A 
     Year | Time  
     2015 | 2:35:09 
     2014 | 2:47:34 
     2013 | 2:50:12 
    Race B 
     Year | Time 
     2013 | 1:32:07 

Runner B | Male | 29 
    Race A 
     Year | Time 
     2015 | 3:05:56 

Runner C | Female | 32 
    Race B 
     Year | Time 
     1998 | 1:29:43 
+1

Ich sehe nicht, warum dies multi-indiziert werden muss, warum kann Runner nicht eine Spalte und Jahr und Rennen sein? – EdChum

+0

Dank @EdChum, das könnte immer noch die beste Option sein, aber ich wollte vermeiden, dass alle Runner-Profildaten (wie Geschlecht, Alter usw.) in jeder Zeile gespeichert werden müssen. – Danwise

+0

Wird das Alter spezifisch für das Rennen oder den aktuellen Status des Läufers sein? – piRSquared

Antwort

3

Ich glaube, Sie Multiindex verwenden können und dann Daten auswählen, indem slicers:

import pandas as pd 

df = pd.DataFrame({'Time': {('Runner A', 'Male', 35, 'Race A', 2014): '2:47:34', ('Runner C', 'Female', 32, 'Race B', 1998): '1:29:43', ('Runner B', 'Male', 29, 'Race A', 2015): '3:05:56', ('Runner A', 'Male', 35, 'Race A', 2013): '2:50:12', ('Runner A', 'Male', 35, 'Race B', 2013): '1:32:07', ('Runner A', 'Male', 35, 'Race A', 2015): '2:35:09'}}) 
print (df) 
            Time 
Runner A Male 35 Race A 2013 2:50:12 
          2014 2:47:34 
          2015 2:35:09 
        Race B 2013 1:32:07 
Runner B Male 29 Race A 2015 3:05:56 
Runner C Female 32 Race B 1998 1:29:43 

#index has to be fully lexsorted 
df.sort_index(inplace=True) 
print (df) 
            Time 
Runner A Male 35 Race A 2013 2:50:12 
          2014 2:47:34 
          2015 2:35:09 
        Race B 2013 1:32:07 
Runner B Male 29 Race A 2015 3:05:56 
Runner C Female 32 Race B 1998 1:29:43 

idx = pd.IndexSlice 
print (df.loc[idx['Runner A',:,:,'Race A',:],:]) 
           Time 
Runner A Male 35 Race A 2013 2:50:12 
         2014 2:47:34 
         2015 2:35:09 

print (df.loc[idx[:,:,:,'Race A',2015],:]) 
           Time 
Runner A Male 35 Race A 2015 2:35:09 
Runner B Male 29 Race A 2015 3:05:56 
+0

Das sieht aus wie es wird perfekt funktionieren. Vielen Dank! – Danwise

1

Einfacher Ansatz:

runners = pd.DataFrame(
    [ 
     ['Bob', 'Male', 1980], 
     ['Tom', 'Male', 1986], 
     ['Amy', 'Female', 1966], 
    ], 
    columns=['Name', 'Gender', 'BirthYear'] 
) 

races = pd.DataFrame(
    [ 
     ['A', 2015, 'Bob', '2:35:09'], 
     ['A', 2014, 'Bob', '2:47:34'], 
     ['A', 2013, 'Bob', '2:50:12'], 
     ['B', 2013, 'Bob', '1:32:07'], 
     ['A', 2015, 'Tom', '3:05:56'], 
     ['B', 1998, 'Amy', '1:29:43'], 
    ], 
    columns=['Race', 'Year', 'Name', 'Time'] 
) 


print races.loc[(races.Name == 'Bob') & (races.Race == 'A')][['Time']] 
print 
print races.loc[(races.Year == 2015) & (races.Race == 'A')][['Name', 'Time']] 

     Time 
0 2:35:09 
1 2:47:34 
2 2:50:12 

    Name  Time 
0 Bob 2:35:09 
4 Tom 3:05:56 

wieder alle Daten

df = races.merge(runners) 

get Alter bei rac e-Zeit

df['Age'] = df.Year - df.BirthYear 
print df 

    Race Year Name  Time Gender BirthYear Age 
0 A 2015 Bob 2:35:09 Male  1980 35 
1 A 2014 Bob 2:47:34 Male  1980 34 
2 A 2013 Bob 2:50:12 Male  1980 33 
3 B 2013 Bob 1:32:07 Male  1980 33 
4 A 2015 Tom 3:05:56 Male  1986 29 
5 B 1998 Amy 1:29:43 Female  1966 32 
+0

Dank @piRSquared, ich wollte vermeiden, dass alle Runner-Profile-Daten (wie Geschlecht, Alter, etc.) in jeder Zeile gespeichert werden müssen, aber das kann immer noch eine Option sein. – Danwise

+0

@Danwise verstanden. Ich poste etwas anderes. – piRSquared

+0

mit einer anderen Idee aktualisiert. – piRSquared