我正在尝试使用dask
. 我最初以这种方式将我的 ROOT 文件读uproot
入 a pandas.DataFrame
:
import uproot
file_name = "ntuple.root"
tree_name = "Events"
branches = ["Trigger", "nTracks", "mass"]
df = uproot.open(file_name)[tree_name].pandas.df(branches)
df.dtypes.to_dict()
# {'Trigger': dtype('bool'),
# 'nTracks': dtype('uint64'),
# 'mass': dtype('float64')}
当我这样做时,一切正常,不同分支的类型被正确识别。特别是,在上面的示例中,"Trigger"
分支是布尔值,"nTracks"
分支是整数,"mass"
分支是浮点数。
但是,当我使用读取同一个文件时,uproot.daskframe
我取而代之的是取回一个分配了所有三个分支的 daskframe float64
,如下所示:
df = uproot.daskframe(file_name, tree_name, branches)
df.dtypes.to_dict()
# {'Trigger': dtype('float64'),
# 'nTracks': dtype('float64'),
# 'mass': dtype('float64')}
这使脚本稍后中断,因为我需要将触发器分支专门解释为一个简单的布尔值,以便对其进行剪切。
理想情况下,我希望它能够自动识别每一列的正确 dtype。
或者,手动设置它们对我来说也很好。我可以通过以旧方式阅读一个事件并使用它来找出正确的 dtypes。根据文档,我应该能够传递一个返回 a 的字典uproot.interp.interp.Interpretation
,但我不清楚它到底是如何工作的。
这整个混乱是使用dask
还是限制uproot
?
作为参考,我使用的是 uproot 3.11.3 并安装了 dask 版本 2.6.0。