2015-01-04 4 views
4

Я пытаюсь применить функцию к каждому DataFrame в панели 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) 

, которая дает нужный результат, но когда я его профиль, только 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 х 2 DataFrame в конденсатор.

+0

Мне пришлось явно преобразовать возвращаемое значение 'конденсатора' для плавания, но потом оно отлично работало. –

Смежные вопросы