L oop более pandas записей или вложенных записей .dataframe - PullRequest
2 голосов
/ 03 марта 2020

Я использую root для преобразования ROOT .TTree в pandas .Dataframe. Структуру данных можно увидеть ниже. Обратите внимание, что «met» - это переменная начального уровня, а «mu_cells_ *» - переменная уровня подстатьи.

Теперь я хочу создать гистограмму ROOT .TH1 для «met». Я спросил на форуме root, что это можно сделать, только циклически перебирая фрейм данных и выполняя ROOT .TH1.Fill () для каждой записи (не для вложенной записи, чтобы избежать многократного подсчета), см. Ссылку . Я хотел бы спросить, каков наилучший способ сделать это?

Точно так же, как я могу сделать TH1 из 'mu_cells_e' теперь, когда он должен l oop над вложенной записью?

Best,

Yosse

                             met  mu_cells_e  mu_cells_side  mu_cells_tower
entry subentry                                                         
0     0         71755.648438  179.995682             -1               6
      1         71755.648438 -308.388519             -1               7
      2         71755.648438   15.558195             -1               8
      3         71755.648438  252.033691             -1               6
      4         71755.648438  459.172119             -1               7
...                      ...         ...            ...             ...
7107  22        26328.087891  611.708374              1               4
      23        26328.087891  -13.317616              1               6
      24        26328.087891   12.681366              1               2
      25        26328.087891   -4.776075              1               4
      26        26328.087891  -17.860764              1               6

[173410 rows x 4 columns]

1 Ответ

0 голосов
/ 03 марта 2020

Вам потребуется сначала извлечь серию для дальнейших вычислений, потому что ROOT, буст-гистограмма или любой другой инструмент не будут знать о субиндексировании Pandas. Это можно сделать следующим образом:

mu_cells_side = frame.mu_cells_side.xs(0, level='subentry')

Теперь вы можете использовать .FillN(len(mu_cells_side), mu_cells_side, ROOT.nullptr) TH1's или заполнение гистограммы или NumPy, так как это нормальный массив на данный момент (и вы можете свободно вызывать mu_cells_side = np.asarray(mu_cells_side) если кого-то из них волнует, что это настоящий массив np, но я не думаю, что это так). Это будет намного быстрее, чем попытка l oop в Python.

Наличие MWE было бы полезно для настройки аналогичного DataFrame:

import pandas as pd
indarr = [[0, 0, 1, 1, 2, 2, 2, 3],
          [0, 1, 0, 1, 0, 1, 2, 0]]
ind = pd.MultiIndex.from_tuples(list(zip(*indarr)), names=['entry', 'subentry'])
f = pd.DataFrame({"mu_cells_side":[2,2,3,3,1,1,1,8] , "mu_cells_tower":[1,2,3,4,5,6,7,8]}, index=ind)
...