Я пытаюсь применить функцию к каждому 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
Мне пришлось явно преобразовать возвращаемое значение 'конденсатора' для плавания, но потом оно отлично работало. –