我有一个多索引数据框,看起来像这样:
df = {'C': {('S', 0): 'A',
('S', 2): 'A',
('T', 0): 'A',
('T', 1): 'A',
('T', 3): 'A',
('U', 1): 'A',
('U', 2): 'A',
('U', 0): 'A',
('V', 0): 'A',
('W', 2): 'A',
('W', 0): 'A',
('X', 0): 'A',
('Y', 3): 'A',
('Z', 0): 'A',
('Z', 1): 'A'},
'D': {('S', 0): '15',
('S', 2): '22',
('T', 0): '20',
('T', 1): '20',
('T', 3): '20',
('U', 1): '18',
('U', 2): '14',
('U', 0): '14',
('V', 0): '14',
('W', 2): '22',
('W', 0): '25',
('X', 0): '15',
('Y', 3): '17',
('Z', 0): '04',
('Z', 1): '16'},
'E': {('S', 0): 1.0,
('S', 2): 1.0,
('T', 0): 2.0,
('T', 1): 2.0,
('T', 0): 2.0,
('U', 1): 2.0,
('U', 2): 2.0,
('U', 0): 2.0,
('V', 0): 1.0,
('W', 2): 1.0,
('W', 0): 1.0,
('X', 0): 1.0,
('Y', 3): 2.0,
('Z', 0): 3.0,
('Z', 1): 3.0}}
如果级别1中的值>=2,我希望保留级别0行
输出将如下所示:
outp = {'C': {('S', 0): 'A',
('S', 2): 'A',
('T', 0): 'A',
('T', 1): 'A',
('T', 3): 'A',
('U', 1): 'A',
('U', 2): 'A',
('U', 0): 'A',
('W', 2): 'A',
('W', 0): 'A',
('Y', 3): 'A'},
'D': {('S', 0): '15',
('S', 2): '22',
('T', 0): '20',
('T', 1): '20',
('T', 3): '20',
('U', 1): '18',
('U', 2): '14',
('U', 0): '14',
('W', 2): '22',
('W', 0): '25',
('Y', 3): '17'},
'E': {('S', 0): 1.0,
('S', 2): 1.0,
('T', 0): 2.0,
('T', 1): 2.0,
('T', 0): 2.0,
('U', 1): 2.0,
('U', 2): 2.0,
('U', 0): 2.0,
('W', 2): 1.0,
('W', 0): 1.0,
('Y', 3): 2.0}}
我所做的是,当级别1>=2时,我从级别0获取了值,但因为在执行此操作时,我删除了级别1中应保留的值0和1,所以我必须使用获取的值创建另一个 Dataframe ,然后使用“内部”合并。我得到了期望的输出,但我肯定走了很长很可能很愚蠢的路。
我怎样才能做得更好?
谢谢
3条答案
按热度按时间cczfrluj1#
让我们试试看
groupby filter
在…上level=0
和过滤器,以在存在时保持级别0值any
索引级别1中的值(get_level_values
)大于或等于2:C D E
S 0 A 15 1.0
2 A 22 1.0
T 0 A 20 2.0
1 A 20 2.0
3 A 20 NaN
U 1 A 18 2.0
2 A 14 2.0
0 A 14 2.0
W 2 A 22 1.0
0 A 25 1.0
Y 3 A 17 2.0
qlckcl4x2#
获取级别0中的索引,其中级别1>=2,并索引主
df
:vzgqcmou3#
这里有一种不同的方式: