假设我有一个多索引数据框,如下所示:
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
的最大值,并收集第二级索引当发生这种情况时。
我怎么能在熊猫中做到这一点?
答案 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()