在 pandas 多索引中获取特殊组
Get special group in pandas multiindex
我有一个带有 MultiIndex 的 DataFrame,如下所示:
In [5]: df
Out[5]:
a b
lvl0 lvl1 lvl2
A0 B0 C0 0 1
C1 2 3
C2 4 5
C3 6 7
B1 C0 8 9
C1 10 11
C2 12 13
C3 14 15
A1 B0 C0 16 47
C1 18 49
C2 20 41
C3 22 43
B1 C0 24 25
C1 26 27
C2 28 29
C3 30 31
A2 B0 C0 32 33
C1 34 35
C2 36 37
C3 38 39
B1 C0 40 41
C1 42 43
C2 44 45
C3 46 47
我想在每个 lvl0 索引中得到特殊的 lvl1 组。在这种情况下,选择列 b 具有最大值的组,结果可能是这样的:
a b
lvl0 lvl1 lvl2
A0 B1 C0 8 9
C1 10 11
C2 12 13
C3 14 15
A1 B0 C0 16 47
C1 18 49
C2 20 41
C3 22 43
A2 B1 C0 40 41
C1 42 43
C2 44 45
C3 46 47
有没有像df[(('A0','B1'),('A1','B0'),('A2','B1')),:]
这样的索引方法?我已经尽力了,感谢您的帮助。
您可以使用:
df1 = df.reset_index(level=2, drop=True)
mask = df1.index.isin(df1.groupby(level=[0])['b'].idxmax())
df = df[mask]
print (df)
a b
lvl0 lvl1 lvl2
A0 B1 C0 8 9
C1 10 11
C2 12 13
C3 14 15
A1 B0 C0 16 47
C1 18 49
C2 20 41
C3 22 43
A2 B1 C0 40 41
C1 42 43
C2 44 45
C3 46 47
解释:
首先通过 reset_index
and groupby
with idxmax
删除 MultiIndex
的 3 级,以获得列 b
中最大值的索引:
df1 = df.reset_index(level=2, drop=True)
idx = df1.groupby(level=[0])['b'].idxmax()
print (idx)
lvl0
A0 (A0, B1)
A1 (A1, B0)
A2 (A2, B1)
Name: b, dtype: object
然后通过比较 isin
:
创建布尔掩码
print (df1.index.isin(idx))
[False False False False True True True True True True True True
False False False False False False False False True True True True]
最后过滤 boolean indexing
:
df = df[df1.index.isin(idx)]
print (df)
a b
lvl0 lvl1 lvl2
A0 B1 C0 8 9
C1 10 11
C2 12 13
C3 14 15
A1 B0 C0 16 47
C1 18 49
C2 20 41
C3 22 43
A2 B1 C0 40 41
C1 42 43
C2 44 45
C3 46 47
我有一个带有 MultiIndex 的 DataFrame,如下所示:
In [5]: df
Out[5]:
a b
lvl0 lvl1 lvl2
A0 B0 C0 0 1
C1 2 3
C2 4 5
C3 6 7
B1 C0 8 9
C1 10 11
C2 12 13
C3 14 15
A1 B0 C0 16 47
C1 18 49
C2 20 41
C3 22 43
B1 C0 24 25
C1 26 27
C2 28 29
C3 30 31
A2 B0 C0 32 33
C1 34 35
C2 36 37
C3 38 39
B1 C0 40 41
C1 42 43
C2 44 45
C3 46 47
我想在每个 lvl0 索引中得到特殊的 lvl1 组。在这种情况下,选择列 b 具有最大值的组,结果可能是这样的:
a b
lvl0 lvl1 lvl2
A0 B1 C0 8 9
C1 10 11
C2 12 13
C3 14 15
A1 B0 C0 16 47
C1 18 49
C2 20 41
C3 22 43
A2 B1 C0 40 41
C1 42 43
C2 44 45
C3 46 47
有没有像df[(('A0','B1'),('A1','B0'),('A2','B1')),:]
这样的索引方法?我已经尽力了,感谢您的帮助。
您可以使用:
df1 = df.reset_index(level=2, drop=True)
mask = df1.index.isin(df1.groupby(level=[0])['b'].idxmax())
df = df[mask]
print (df)
a b
lvl0 lvl1 lvl2
A0 B1 C0 8 9
C1 10 11
C2 12 13
C3 14 15
A1 B0 C0 16 47
C1 18 49
C2 20 41
C3 22 43
A2 B1 C0 40 41
C1 42 43
C2 44 45
C3 46 47
解释:
首先通过 reset_index
and groupby
with idxmax
删除 MultiIndex
的 3 级,以获得列 b
中最大值的索引:
df1 = df.reset_index(level=2, drop=True)
idx = df1.groupby(level=[0])['b'].idxmax()
print (idx)
lvl0
A0 (A0, B1)
A1 (A1, B0)
A2 (A2, B1)
Name: b, dtype: object
然后通过比较 isin
:
print (df1.index.isin(idx))
[False False False False True True True True True True True True
False False False False False False False False True True True True]
最后过滤 boolean indexing
:
df = df[df1.index.isin(idx)]
print (df)
a b
lvl0 lvl1 lvl2
A0 B1 C0 8 9
C1 10 11
C2 12 13
C3 14 15
A1 B0 C0 16 47
C1 18 49
C2 20 41
C3 22 43
A2 B1 C0 40 41
C1 42 43
C2 44 45
C3 46 47