2

我正在使用pandasuproot从 .root 文件中读取数据,我得到如下表:

桌子

所以,从我的 .root 文件中,我得到了一些树枝。

fname = 'ZZ4lAnalysis_VBFH.root' 
key = 'ZZTree/candTree'
ttree = uproot.open(fname)[key]
branches = ['nCleanedJets', 'JetPt', 'JetMass', 'JetPhi'] 
df = ttree.pandas.df(branches, entrystop=40306)

本质上,我必须为每个条目检索“JetPhi”数据,其中有超过 2 个子条目(或等效地,“nCleanedJets”等于或大于 2 的条目),计算前两个之间“JetPhi”的差异子条目,然后为这些差异制作直方图。

我试图在互联网上查找并尝试了不同的可能性,但我没有找到任何有用的解决方案。如果有人能给我任何提示、建议和/或建议,我将不胜感激。我以前用 C++ 编写代码,但我是 python 新手。

我以前用 C++ 编写代码,所以我是 python 新手,但我仍然不掌握这种语言。

4

1 回答 1

1

你可以在 Pandas 中使用

df[df["nCleanedJets"] >= 2]

因为您有一列包含条目数。该df["nCleanedJets"] >= 2表达式返回一个Series布尔值(True如果一行通过,False如果一行不通过),并将一个Series或 NumPy 数组作为方括号掩码中的切片传递给该数组(返回布尔数组所在的行True)。

您也可以在转换为 Pandas 之前在 Awkward Array 中执行此操作,如果您没有"nCleanedJets"列,这会更容易。

array = ttree.arrays(branches, entrystop=40306)
selected = array[array.counts >= 2]

awkward.topandas(selected, flatten=True)

Awkward Array 中的掩码遵循相同的原则,但使用数据结构而不是平面Series或 NumPy 数组( 的每个元素array是具有"nCleanedJets", "JetPt", "JetPhi","JetMass"字段的记录列表,并且counts是每个列表的长度)。

awkward.topandaswithflatten=True等价于 uproot 的作用 when outputtype=pandas.DataFrameand flatten=True(默认为ttree.pandas.df)。

于 2020-02-04T13:46:59.230 回答