在pandas.dataframe的条目或子条目上循环

2024-09-25 00:33:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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

现在我想创建一个“met”的ROOT.TH1柱状图。我曾在根论坛中询问,这只能通过在dataframe上循环并对每个条目执行root.TH1.Fill()(不是子条目以避免多次计数)来完成,请参见link。我想问一下,最好的方法是什么

类似地,既然“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]

Tags: 数据dataframepandas条目root结构论坛cells
1条回答
网友
1楼 · 发布于 2024-09-25 00:33:30

您需要首先提取一个序列进行进一步的计算,因为ROOT、boost直方图或任何其他工具都不知道熊猫子索引。可以这样做:

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

现在您可以使用TH1的.FillN(len(mu_cells_side), mu_cells_side, ROOT.nullptr)或boost直方图的fill或NumPy,因为此时它是一个普通数组(如果有人关心它是一个真正的np数组,请随意调用mu_cells_side = np.asarray(mu_cells_side),但我认为他们不会)。这将比尝试在Python中循环快得多

拥有MWE将有助于建立类似的数据帧:

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)

相关问题 更多 >