2015-01-04 89 views
4

我想要的功能應用到熊貓面板中的每一個數據幀的數據幀的每個。我可以把它寫成一個循環,但索引似乎需要很長時間。我希望內建的熊貓功能可能會更快。如何有效地應用功能的大熊貓面板

我有看起來像(在現實中每列約50行)的數據幀:

mydata = pd.DataFrame({ 'hits' : [ 123, 456,678 ], 'sqerr' : [ 253, 641, 3480] }) 

它們與多索引關鍵字配置在面板:

mydict = { (0, 20) : mydata, (30, 40) : moredata } 
mypanel = pd.Panel(mydict) 

面板看起來像這樣:

<class 'pandas.core.panel.Panel'> 
Dimensions: 1600 (items) x 48 (major_axis) x 2 (minor_axis) 
Items axis: (-4000, -4000) to (3800, 3800) 
Major_axis axis: 0 to 47 
Minor_axis axis: hits to sqerr 

我有一個函數,它需要一個DataFrame並輸出一個數字:

def condenser(df): 
    return some_stuff(df['hits'], df['sqerr']) 

我想將我的面板減少到一個系列,由我的多指數索引,並將我的聚光功能的結果作爲其值。

我可以這樣做:

intermediate = [] 
for k, df in mypanel.iteritems(): 
    intermediate.append(condenser(df)) 

result = pd.Series(results, index = pypanel.items) 

這給需要的結果,但是當我描述文件時,只有4%的時間在我的condenser功能度過的。大部分時間都花在iteritems__getitem__,所以我想知道它是否可以做得更好。

我看着mypanel.apply(condenser, axis = 'items')但這種單獨遍歷我DataFrames的每一列。有沒有什麼東西會對每個DataFrame應用一個函數?

P.s.我使用Python 2.7.9和熊貓0.15.2

回答

2

申請是正確的,但是用法是:

mypanel.apply(冷凝器,軸= [1,2])

這將通過一個48 x 2的數據幀進入冷凝器。

+0

我必須明確地轉換'condenser'浮動的返回值,但隨後完美。 – 2015-01-12 13:32:54