考虑以下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()
但显然大熊猫索引并不是这样的。有人有更好的方法吗?
干杯
答案 0 :(得分:2)
我会跳过groupby
example.unstack(0).ix[1922:1924].sum()
pp_delay
-1000 0.0
-500 -0.2
-400 0.8
dtype: float64