问题描述
我对于连根拔起和Python还是很陌生,但希望很快能赶上。
我想知道为什么方法.pandas()
从TH2D直方图创建如此奇怪的表:
myhisto = file["angular_distr_el/ID3_mol_e0_valid/EN_gate/check_cthetaEE_x"]
type(myhisto)
输出:
uproot.rootio.TH2D
最后,myhisto.pandas()返回:
count variance
cos(theta) electron energy [eV]
[-inf,-1.0) [-inf,10.0) 0.0 0.0
[10.0,10.15) 0.0 0.0
[10.15,10.3) 0.0 0.0
[10.3,10.45) 0.0 0.0
[10.45,10.6) 0.0 0.0
... ... ... ...
[1.0,inf) [24.4,24.549999999999997) 0.0 0.0
[24.549999999999997,24.7) 0.0 0.0
[24.7,24.85) 0.0 0.0
[24.85,25.0) 0.0 0.0
[25.0,inf) 0.0 0.0
2244 rows × 2 columns
和myhisto.columns
返回:
Index(['count','variance'],dtype='object')
在哪里可以找到方法.pandas()
的文档以了解它的作用?有没有办法在具有正确列的DataFrame中重新组织myhisto
?
解决方法
经过一些有趣但无所不顾的浏览之后,我了解了它是哪种类型的对象。这是创建排序 MultiIndex DataFrames 的非常聪明的方法。只需输入myhisto.index即可直接看到它:
MultiIndex([([-inf,-1.0),[-inf,10.0)),([-inf,[10.0,10.15)),[10.15,10.3)),[10.3,10.45)),[10.45,10.6)),[10.6,10.75)),[10.75,10.9)),[10.9,11.05)),[11.05,11.2)),[11.2,11.35)),...
( [1.0,inf),[23.65,23.799999999999997)),( [1.0,[23.799999999999997,23.95)),[23.95,24.1)),[24.1,24.25)),[24.25,24.4)),[24.4,24.549999999999997)),[24.549999999999997,24.7)),[24.7,24.85)),[24.85,25.0)),[25.0,inf))],names=['cos(theta)','electron energy [eV]'],length=2244)
解决方案是拆开或创建DataFrame的数据透视表。对于此特定对象,数据透视表更好,因为在原始DataFrame中作为列存在计数和方差。例如:
myhisto.unstack()
count ... variance
electron energy [eV] [-inf,10.0) [10.0,10.15) [10.15,10.3) [10.3,10.45) [10.45,10.6) [10.6,10.75) [10.75,10.9) [10.9,11.05) [11.05,11.2) [11.2,11.35) ... [23.65,23.799999999999997) [23.799999999999997,23.95) [23.95,24.1) [24.1,24.25) [24.25,24.4) [24.4,24.549999999999997) [24.549999999999997,24.7) [24.7,24.85) [24.85,25.0) [25.0,inf)
cos(theta)
[-inf,-1.0) 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
[-1.0,-0.9) 0.0 1.0 1.0 0.0 0.0 2.0 0.0 2.0 0.0 1.0 ... 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0
[-0.9,-0.8) 0.0 0.0 3.0 3.0 0.0 0.0 0.0 0.0 1.0 1.0 ... 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0
[-0.8,-0.7) 0.0 0.0 1.0 2.0 0.0 1.0 1.0 2.0 1.0 1.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
[-0.7,-0.6) 0.0 0.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 ... 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0
[-0.6,-0.5) 0.0 1.0 1.0 1.0 0.0 0.0 2.0 1.0 0.0 3.0 ... 0.0 1.0 0.0 1.0 1.0
**22 rows × 204 columns**
vs。
pivot_pipanda = pipanda.pivot_table(values="count",index="cos(theta)",columns="electron energy [eV]")
electron energy [eV] [-inf,-0.5) 0.0 1.0 1.0 1.0 0.0 0.0 2.0 1.0 0.0 3.0 ... 0.0 1.0 0.0 1.0 1.0 0.0 1.0 0.0 0.0 0.0
[-0.5,-0.3999999999999999) 0.0 0.0 2.0 0.0 1.0 1.0 3.0 2.0 3.0 1.0 ... 3.0 0.0 0.0 0.0 0.0 2.0 0.0 1.0 1.0 0.0
从这里可以使用熊猫的标准方法!
(要使用loc []和iloc []等切片技术:https://www.youtube.com/watch?v=tcRGa2soc-c)