玩具示例
假设我有以下所示的数据框df
C
L0 L1 L2
0 w P 11
Q 9
R 21
S 4
x P 3
Q 0
R 23
S 20
y P 19
Q 0
R 7
S 13
z P 17
Q 0
R 5
S 1
1 w P 8
Q 2
R 12
S 0
x P 22
Q 14
R 2
S 18
y P 6
Q 0
R 16
S 15
z P 10
Q 0
R 8
S 0
请注意,df
的行由3级多索引编制索引。
我可以为C
级别的每个值找到L2
列的最小值,如下所示:
In [58]: df.groupby(level='L2').min()
Out[58]:
C
L2
P 3
Q 0
R 2
S 0
同样,以下表达式显示此最小值大于0的L2
值:
In [59]: df.groupby(level='L2').min() > 0
Out[59]:
C
L2
P True
Q False
R True
S False
问题:如何选择与df
的最小值L2
的值相对应的原始数据框C
的行0?
在这个简单的示例中,问题归结为选择df
值L2
为'P'
或'R'
的{{1}}行。因此,通过将L2='P'
的行与L2='R'
的行连接来强制解决问题并不困难。
然而,在我想到的应用程序中,这样的解决方案变得难以处理,因为这里L2
级别具有~2000个值,并且对于其中大约一半,最小值大于0。
因此,我正在寻找一种更具伸缩性的方法来解决这一选择问题。
数据
L0 L1 L2 C
0 w P 11
0 w Q 9
0 w R 21
0 w S 4
0 x P 3
0 x Q 0
0 x R 23
0 x S 20
0 y P 19
0 y Q 0
0 y R 7
0 y S 13
0 z P 17
0 z Q 0
0 z R 5
0 z S 1
1 w P 8
1 w Q 2
1 w R 12
1 w S 0
1 x P 22
1 x Q 14
1 x R 2
1 x S 18
1 y P 6
1 y Q 0
1 y R 16
1 y S 15
1 z P 10
1 z Q 0
1 z R 8
1 z S 0
答案 0 :(得分:1)
以这种方式
存储所需的L2
值
In [413]: m = df.groupby(level='L2').min() > 0
In [414]: m
Out[414]:
C
L2
P True
Q False
R True
S False
使用,get_level_values(index_level_name).isin(to_be_filtered)
只过滤所需的值。
In [415]: df[df.index.get_level_values('L2').isin(m.loc[m.C, :].index)]
Out[415]:
C
L0 L1 L2
0 w P 11
R 21
x P 3
R 23
y P 19
R 7
z P 17
R 5
1 w P 8
R 12
x P 22
R 2
y P 6
R 16
z P 10
R 8
以其他方式。使用,转换和子集选择
In [430]: df[(df.groupby(level='L2').transform('min') > 0).C]
Out[430]:
C
L0 L1 L2
0 w P 11
R 21
x P 3
R 23
y P 19
R 7
z P 17
R 5
1 w P 8
R 12
x P 22
R 2
y P 6
R 16
z P 10
R 8
详细
In [416]: m.loc[m.C, :].index
Out[416]: Index([u'P', u'R'], dtype='object', name=u'L2')