Pandas中的分层/多索引操作

时间:2014-02-25 00:25:55

标签: python pandas

假设我有一个多索引数据框,如下所示:

                     A         B         C
X      Y                              
bar   one    -0.007381 -0.365315 -0.024817
      two    -1.219794  0.370955 -0.795125
baz   one     0.145578  1.428502 -0.408384
      two    -0.249321 -0.292967 -1.849202
      three  -0.249321 -0.292967 -1.849202
      four    0.21     -0.967123  1.202234
foo   one    -1.046479 -1.250595  0.781722
      two     1.314373  0.333150  0.133331
qux   one     0.716789  0.616471 -0.298493
      two     0.385795 -0.915417 -1.367644

我想为第一级(A)的每个值获得X最大值,并收集第二级索引当发生这种情况时。

我怎么能在熊猫中做到这一点?

2 个答案:

答案 0 :(得分:3)

In [87]: df.loc[df['A'].groupby(level='X').idxmax(), 'A']
Out[87]: 
X    Y   
bar  one    -0.007381
baz  four    0.210000
foo  two     1.314373
qux  one     0.716789
Name: A, dtype: float64

要查找中值,您可以使用

df['A'].groupby(level='X').median()

但不太清楚哪一行应与中位数相关联,因为如果组中有偶数行,则使用中间行的平均值来计算中位数。 因此,中位数与一行无关,而是两行。

如果您做出任意决定,例如想要n//2行(而不是(n-1)//2行),那么您可以使用

grouped =  df['A'].groupby(level='X', sort=True)
df.loc[grouped.apply(lambda grp: grp.index[grp.count()//2]), 'A']

找到中间值和“关联”行。

例如,

In [93]: df.loc[grouped.apply(lambda grp: grp.index[grp.count()//2]), 'A']
Out[93]: 
X    Y    
bar  two     -1.219794
baz  three   -0.249321
foo  two      1.314373
qux  two      0.385795
Name: A, dtype: float64

答案 1 :(得分:1)

使用groupby对象:

groups = df['A'].groupby(level='X')
groups.min()