如何在pandas.multiindex的水平上应用条件?

时间:2012-10-29 10:10:58

标签: python pandas dataframe multi-index

我的数据如下所示(ch =频道,det =探测器):

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次测量的所有检测器仍然是常数,但其值不可预测,也不是序列。

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

c  time  mean_counts_over_detectors
1   0       xxx
2   0       yyy
1   1       zzz
1   1       www

即,我想分别在每个时间点对所有1个通道的检测器应用np.mean。我可以写kludgy循环,但我觉得大熊猫必须有内置的东西。我仍然是熊猫的初学者,尤其是MultiIndex有很多概念,我不确定我应该在文档中寻找什么。

标题包含'条件'因为我认为可能事实上我希望一个通道的所有检测器的平均值对于时间相同的计数可以表示为切片条件。

2 个答案:

答案 0 :(得分:3)

与@meteore相同,但使用MultiIndex。

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

小心浮动& groupby(这与MultiIndex无关),由于与浮点数相关的数值表示/精度限制,组可能会有所不同。

答案 1 :(得分:2)

不使用MultiIndexes(如果你有,可以通过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)))

使用groupbymean作为聚合函数:

>>> df.groupby(['time', 'ch'])['counts'].mean()
time  ch
0     1     315.000000
      2     296.666667
1     1     178.333333
      2     221.666667
Name: counts

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

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