2016-06-10 133 views
3

我想存儲在大熊貓數據幀或面板某些多維數據,使得我想能夠返回例如:多維/嵌套數據幀/數據集/面板中大熊貓

  1. 所有次爲跑步者,爭奪賽A A
  2. 所有時間(和名稱)爲某年說2015年

實例數據會是這個樣子,請注意,並非所有參賽者將對所有數據幾年或所有的比賽。

任何人都可以建議一個很好的方式來做到這一點與熊貓或任何其他方式?

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

我不明白爲什麼這需要多索引,爲什麼不能成爲一個專欄和一年的賽跑? – EdChum

+0

感謝@EdChum,這可能仍然是最好的選擇,但我試圖避免在每一行中存儲所有Runner Profile數據(例如性別,年齡等)。 – Danwise

+0

年齡是否會針對比賽進行時的具體情況或賽跑者的當前狀態? – piRSquared

回答

3

我認爲你可以使用Multiindex然後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

這看起來像它會完美的工作。謝謝! – Danwise

1

簡單的方法:

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 

找回所有數據

df = races.merge(runners) 

GET年齡在外部e時間

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

感謝@piRSquared,我試圖避免在每一行中存儲所有Runner Profile數據(例如性別,年齡等),但這仍然是一個選項。 – Danwise

+0

@Danwise瞭解。我會張貼別的東西。 – piRSquared

+0

更新了一個不同的想法。 – piRSquared