循环 pandas.dataframe 的条目或子条目
Loop over pandas.dataframe's entries or sub-entries
我正在使用 uproot 将 ROOT.TTree 转换为 pandas.dataframe。数据框的结构如下所示。请注意,“met”是入门级变量,而“mu_cells_*”是子入门级变量。
现在我想创建 'met' 的 ROOT.TH1 直方图。我在根论坛上问过,这只能通过遍历数据帧并为每个条目执行 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]
您需要先提取一个 Series 才能进行任何进一步的计算,因为 ROOT、boost-histogram 或任何其他工具都不知道 Pandas 子索引。可以这样做:
mu_cells_side = frame.mu_cells_side.xs(0, level='subentry')
现在您可以使用 TH1 的 .FillN(len(mu_cells_side), mu_cells_side, ROOT.nullptr)
或 boost-histogram 的填充或 NumPy,因为此时它是一个普通数组(如果有人关心,请随时调用 mu_cells_side = np.asarray(mu_cells_side)
它是一个真正的 np 数组,但我不认为他们这样做)。这比尝试在 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)
我正在使用 uproot 将 ROOT.TTree 转换为 pandas.dataframe。数据框的结构如下所示。请注意,“met”是入门级变量,而“mu_cells_*”是子入门级变量。
现在我想创建 'met' 的 ROOT.TH1 直方图。我在根论坛上问过,这只能通过遍历数据帧并为每个条目执行 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]
您需要先提取一个 Series 才能进行任何进一步的计算,因为 ROOT、boost-histogram 或任何其他工具都不知道 Pandas 子索引。可以这样做:
mu_cells_side = frame.mu_cells_side.xs(0, level='subentry')
现在您可以使用 TH1 的 .FillN(len(mu_cells_side), mu_cells_side, ROOT.nullptr)
或 boost-histogram 的填充或 NumPy,因为此时它是一个普通数组(如果有人关心,请随时调用 mu_cells_side = np.asarray(mu_cells_side)
它是一个真正的 np 数组,但我不认为他们这样做)。这比尝试在 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)