如何有效地将函数应用于Pandas面板的每个DataFrame

时间:2015-01-04 13:15:32

标签: python pandas

我正在尝试将函数应用于Pandas面板中的每个DataFrame。我可以把它写成循环,但索引似乎需要很长时间。我希望内置的Pandas功能可能更快。

我的数据框看起来像(实际上每列约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 )

给出了所需的结果,但是当我对其进行分析时,我的condenser函数只花费了4%的时间。大部分时间花在iteritems__getitem__上,所以我想知道是否可以做得更好。

我查看了mypanel.apply( condenser, axis = 'items' ),但这会分别在我的DataFrame的每一列上循环。是否有某些功能可以将函数应用于每个DataFrame?

P.S。我使用的是Python 2.7.9和pandas 0.15.2

1 个答案:

答案 0 :(得分:2)

申请是正确的,但用法是:

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

这会将48 x 2 DataFrame传递到电容器中。