2

我正在使用 uproot 将 ROOT.TTree 转换为 pandas.dataframe。数据框的结构如下所示。请注意,“met”是一个入门级变量,而“mu_cells_*”是一个子条目级变量。

现在我想创建一个“met”的 ROOT.TH1 直方图。我在根论坛上问过,这只能通过循环数据帧并为每个条目执行 ROOT.TH1.Fill() 来完成(不是子条目以避免多次计数),请参阅链接。我想问一下,最好的方法是什么?

同样,既然必须遍历子条目,我该如何制作 'mu_cells_e' 的 TH1?

最好的,

约瑟

                             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]
4

1 回答 1

1

您需要先提取一个 Series 以进行任何进一步的计算,因为 ROOT、boost-histogram 或任何其他工具将不知道 Pandas 子索引。可以这样做:

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

现在您可以使用 TH1或 boost-histogram 的填充或 NumPy,因为此时它是一个普通数组(如果有人关心它是一个真正的 np 数组,请随时.FillN(len(mu_cells_side), mu_cells_side, ROOT.nullptr)致电,但我认为他们不会这样做mu_cells_side = np.asarray(mu_cells_side))。这将比尝试在 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)
于 2020-03-03T15:14:37.370 回答