pandas中的组上的函数,其范围由标签

时间:2016-08-03 15:44:26

标签: python pandas

考虑以下Multiindex Pandas Seires:

import pandas as pd
import numpy as np

val = np.array([ 0.4, -0.6,  0.6,  0.5, -0.4,  0.2,  0.6,  1.2, -0.4])
inds = [(-1000, 1921.6), (-1000, 1922.3), (-1000, 1923.0), (-500, 1921.6),
       (-500, 1922.3), (-500, 1923.0), (-400, 1921.6), (-400, 1922.3),
       (-400, 1923.0)]
names = ['pp_delay', 'wavenumber']
example = pd.Series(val)
example.index = pd.MultiIndex.from_tuples(inds, names=names)

example现在应该是

pp_delay  wavenumber
-1000     1921.6        0.4
          1922.3       -0.6
          1923.0        0.6
-500      1921.6        0.5
          1922.3       -0.4
          1923.0        0.2
-400      1921.6        0.6
          1922.3        1.2
          1923.0       -0.4
dtype: float64

我希望按pp_delay对示例进行分组,并使用wavenumber 索引选择每个组中的范围,然后对该子组执行操作。为了澄清我的意思,我有几个例子。

这是一个基于位置的解决方案。

example.groupby(level="pp_delay").nth(list(range(1,3))).groupby(level="pp_delay").sum()

这给出了

pp_delay
-1000    0.0
-500    -0.2
-400     0.8
dtype: float64

现在对每个pp_delay组的元素的最后一个进行求和。

另一种解决方案,更直接的是循环群组:

delays = example.index.levels[0]
res = np.zeros(delays.shape)
roi = slice(1922, 1924)
for i in range(3):
    res[i] = example[delays[i]][roi].sum()
res

给出

array([ 0. , -0.2,  0.8])

无论如何,我不喜欢以太,因为它不适合通常的熊猫风格。

现在我理想的想要的是:

example.groupby(level="pp_delay").loc[1922:1924].sum()

或者甚至可能是

example[:, 1922:1924].sum()

但显然大熊猫索引并不是这样的。有人有更好的方法吗?

干杯

1 个答案:

答案 0 :(得分:2)

我会跳过groupby

example.unstack(0).ix[1922:1924].sum()

pp_delay
-1000    0.0
-500    -0.2
-400     0.8
dtype: float64