Pandas中的分层/多级索引操作

3
假设我有一个多索引数据框如下所示:
                     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

我想要在每个第一层级别(X)的值上获得A最大值,并且在这种情况下收集第二层索引

如何在Pandas中实现?

2个回答

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

谢谢。在此基础上,尝试尽可能地使解决方案更通用。如果我想查找更通用的东西,例如中位数(及其索引),而不是最大值,该怎么办? - Amelio Vazquez-Reina
1
中位数比较棘手。我已经尝试在上面解释了。一般来说,我认为你需要找到所寻找的行的索引公式,然后使用 df.loc 来获取该行。 - unutbu
非常感谢 @unutbu 的帮助。谢谢! - Amelio Vazquez-Reina

1
使用 groupby 对象:
groups = df['A'].groupby(level='X')
groups.min()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接