如何在pandas.multiindex?

2024-05-23 17:05:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我的数据如下(ch=channel,det=detector):

ch det time counts 
1   1    0    123
    2    0    121
    3    0    125 
2   1    0    212
    2    0    210
    3    0    210 
1   1    1    124
    2    1    125
    3    1    123 
2   1    1    210
    2    1    209
    3    1    213

注意,实际上,时间列是一个float,具有大约12个有效数字,对于1个测量值的所有检测器来说仍然是常数,但是它的值是不可预测的,也不能按顺序排列。在

我需要创建一个如下所示的数据帧:

^{pr2}$

也就是说,我想在每个时间分别对1个通道的所有检测器计数应用np.mean。我可以写乱七八糟的循环,但我觉得熊猫一定有某种内在的东西。我对pandas还是个初学者,尤其是多索引有很多概念,我不确定我应该在文档中寻找什么。在

标题中包含“条件”,因为我想也许我想要一个时间相同的计数的所有检测器的平均值,可以用切片条件来表示。在


Tags: 数据timenp时间channel常数chfloat
2条回答

与@meteore相同,但有多个索引。在

In [55]: df
Out[55]:
             counts
ch det time
1  1   0        123
   2   0        121
   3   0        125
2  1   0        212
   2   0        210
   3   0        210
1  1   1        124
   2   1        125
   3   1        123
2  1   1        210
   2   1        209
   3   1        213

In [56]: df.index
Out[56]:
MultiIndex
[(1L, 1L, 0L) (1L, 2L, 0L) (1L, 3L, 0L) (2L, 1L, 0L) (2L, 2L, 0L)
 (2L, 3L, 0L) (1L, 1L, 1L) (1L, 2L, 1L) (1L, 3L, 1L) (2L, 1L, 1L)
 (2L, 2L, 1L) (2L, 3L, 1L)]

In [57]: df.index.names
Out[57]: ['ch', 'det', 'time']

In [58]: df.groupby(level=['ch', 'time']).mean()
Out[58]:
             counts
ch time
1  0     123.000000
   1     124.000000
2  0     210.666667
   1     210.666667

小心使用float和groupby(这是否独立于多索引),由于与float相关的数值表示/精度限制,组可能会有所不同。在

不使用多索引(如果您有多个索引,可以通过df.reset_index()删除它们):

chans = [1,1,1,2,2,2,1,1,1,2,2,2]
df = pd.DataFrame(dict(ch=chans, det=[1,2,3,1,2,3,1,2,3,1,2,3], time=6*[0]+6*[1], counts=np.random.randint(0,500,12)))

使用groupby和{}作为聚合函数:

^{pr2}$

其他聚合函数可以通过agg传递:

>>> df.groupby(['time', 'ch'])['counts'].agg(np.ptp)

相关问题 更多 >