💡 参考文章见Ref,感谢提供思路!
🗺️当前这篇博文地址:https://myoontyee.github.io/article/b20a8a22.html
⚠️警告:博客文章禁止一切形式的非授权非法转载!
⚠️Attention: All forms of unauthorized illegal reposts are prohibited !

创建时间:2022年3月23日10:09:53
最新更新:2022年3月23日10:28:35


核心思路uprootuproot3是两个库,uproot库好用点,用uproot库读一下数据,转换成DataFrame


导入库

1
2
3
import uproot
import numpy as np
import pandas as pd

读取.root文件

1
file = uproot.open('./test.root')

查看索引

  • 查看索引与你设计的数据存储形式有关
  • 假设的文件结构如下
graph TD
A["test.root"]
B1["B1"]
B2[B2]
B3[B3]
B4[B4]
B5[B5]
C1[C1]
C2[C2]
D1[D1]
D2[D2]
A-->B1
A-->B2
A-->B3
A-->B4
A-->B5
B1-->C1
C1-->D1
B1-->C2
C1-->D2

查看根级索引

  • 查看根层级下的索引
1
file.keys()
  • 示例的返回
1
2
3
4
5
['B1;1',
'B2;1',
'B3;1',
'B4;1',
'B5;1',]

查看子级索引

  • 类似pandas的用法
1
file['B1;1'].keys()
  • 示例的返回
1
2
['C1;1',
'C2;1',]
  • 更下一级的查看,可以使用以下形式
1
file['B1;1']['C1;1']
  • 示例的返回
1
2
['D1;1',
'D2;1',]

查看对应目录下的数据

  • 两种方法

法1

1
file['B2;1'].arrays()
  • 示例的返回
1
<Array [{Energy: 10}] type='1 * {"Energy": float64}'>

法2

1
file['B2;1'].array()
  • 示例的返回
1
<Array [10] type='1 * float64'>

批量转换为DataFrame格式

  • 下述代码将根层级下的B2B3B4B5批量导出转换为DataFrame形式
1
2
3
4
5
6
df = pd.DataFrame(file.arrays(   
['B2;1',
'B3;1',
'B4;1',
'B5;1',],
library="pd"))
  • 下述代码将B1子层级下的C1C2批量导出转换为DataFrame格式
1
2
3
4
df = pd.DataFrame(file['B1;1'].arrays(   
['C1;1',
'C2;1',],
library="pd"))

整体代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import uproot
import numpy as np
import pandas as pd

file.keys()

df = pd.DataFrame()
df = pd.DataFrame(file.arrays(
['B2;1',
'B3;1',
'B4;1',
'B5;1',],
library="pd"))

df.to_csv('./test.csv')

Ref