Python 使用Outlot将根文件读入daskframe时自动设置数据类型

Python 使用Outlot将根文件读入daskframe时自动设置数据类型,python,dask,uproot,Python,Dask,Uproot,我正在尝试使用dask并行化一个(有些)简单的脚本。 我最初使用将根文件读入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() # {'Tr

我正在尝试使用
dask
并行化一个(有些)简单的脚本。 我最初使用将根文件读入
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”
分支是一个浮点值

但是,当我使用
uplot.daskframe
读取同一个文件时,我会返回一个daskframe,其中所有三个分支都被分配了
float64
,如下所示:

df = uproot.daskframe(file_name, tree_name, branches)
df.dtypes.to_dict()
# {'Trigger': dtype('float64'),
#  'nTracks': dtype('float64'),
#  'mass': dtype('float64')}
这会使脚本稍后中断,因为我需要将触发器分支具体解释为一个简单的布尔值,以便对其进行剪切

理想情况下,我希望它能够自动识别每个列的正确数据类型

或者,手动设置也可以。通过以旧的方式阅读一个事件并使用它,我可以找到正确的数据类型。我应该能够通过一本返回
outlot.interp.interp.interp.interpremission
的词典,但我不清楚它到底是如何工作的

这整个混乱是使用dask的限制还是根除的限制


作为参考,我使用的是Outlot 3.11.3,并安装了dask 2.6.0版。

由于篇幅较短,我将对此进行评论,而不是回答:我认为这是数据帧限制。熊猫也是如此:有时它会更改您的类型,因为它试图在幕后将多个列放入单个分配的块中。我只是在猜测这一点,但也许Dask数据帧和Pandas数据帧做的事情是一样的。@JimPivarski:如果我尝试只加载一个(非浮点)分支,也会发生这种情况。之后它仍然只有浮动列。如果存在混合数据类型,并且它试图找到限制性最小的数据类型,我可以理解这种行为,但在这种情况下……由于这很短,我将对此进行评论,而不是回答:我认为这是数据帧限制。熊猫也是如此:有时它会更改您的类型,因为它试图在幕后将多个列放入单个分配的块中。我只是在猜测这一点,但也许Dask数据帧和Pandas数据帧做的事情是一样的。@JimPivarski:如果我尝试只加载一个(非浮点)分支,也会发生这种情况。之后它仍然只有浮动列。如果存在混合的数据类型,并且它试图找到限制最少的数据类型,我可以理解这种行为,但是在这种情况下。。。