如何高效地将函数应用于 Pandas Panel 中的每个 DataFrame

4
我将尝试为Pandas Panel中的每个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 )

这段代码可以得出需要的结果,但当我对其进行分析时,只有4%的时间花费在我的condenser函数中。大部分时间都花在了iteritems__getitem__上。因此,我想知道是否可以改进它。

我试着使用mypanel.apply( condenser, axis = 'items' ),但这样会单独循环遍历每个DataFrame的列。是否有一种方法可以将一个函数应用于每个DataFrame?

附:我正在使用Python 2.7.9和pandas 0.15.2。

1个回答

2

apply是正确的,但用法如下:

mypanel.apply(condenser, axis=[1,2])

这将把一个48 x 2的DataFrame传递给condenser函数。


我必须明确地将 condenser 的返回值转换为浮点数,但之后它完美地工作了。 - paco_uk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接