删除 pandas 多列索引中没有名称的所有列级别

问题描述 投票:0回答:2

我有一个多列级数据框。我需要删除所有没有名称的列级别(即

None
)。我事先不知道哪些级别受到影响(如果有的话)。

执行此操作的 Python 方法是什么?

import pandas as pd
import numpy as np
# Create a MultiIndex for the columns with None values in names
index = pd.MultiIndex.from_tuples([
    ('A', 'X', 'I'),
    ('A', 'X', 'II'),
    ('A', 'Y', 'I'),
    ('A', 'Y', 'II'),
    ('B', None, 'I'),
    ('B', None, 'II'),
    ('B', 'Z', 'I'),
    ('B', 'Z', 'II'),
], names=[None, 'level_2', None])
# Create a DataFrame with random values
data = np.random.randint(0, 10, (8, 8))  # Corrected shape to match the MultiIndex
df = pd.DataFrame(data, columns=index)

print(df)

         A            B         
level_2  X     Y    NaN     Z   
         I II  I II   I II  I II
0        5  0  3  5   0  9  6  6
1        6  2  6  3   7  1  8  0
2        7  5  1  0   3  2  9  5
3        8  6  1  5   9  0  8  2
4        4  0  0  2   4  7  0  6
5        3  8  0  5   4  8  6  8
6        2  4  2  7   4  6  5  3
7        6  5  0  3   1  6  0  4

我正在寻找这个结果:

level_2  X     Y    NaN     Z   
0        5  0  3  5   0  9  6  6
1        6  2  6  3   7  1  8  0
2        7  5  1  0   3  2  9  5
3        8  6  1  5   9  0  8  2
4        4  0  0  2   4  7  0  6
5        3  8  0  5   4  8  6  8
6        2  4  2  7   4  6  5  3
7        6  5  0  3   1  6  0  4
python pandas multi-index
2个回答
0
投票

你可以这样做:

drop_me = [idx for idx, name in enumerate(df.columns.names) if name is None]
if drop_me:
    df = df.droplevel(drop_me, axis=1)

0
投票

使用

numpy.where
的一个选项:

out = df.droplevel(np.where(pd.isnull(df.columns.names))[0].tolist(), axis=1)

输出:

level_2  X  X  Y  Y  NaN  NaN  Z  Z
0        0  2  8  7    1    2  3  9
1        5  3  4  4    3    6  9  7
2        5  9  1  8    1    9  9  1
3        1  2  4  0    1    2  0  1
4        9  0  5  6    1    0  0  4
5        5  9  6  6    1    8  8  6
6        7  6  7  4    8    5  7  1
7        6  2  3  7    1    7  2  8
``
© www.soinside.com 2019 - 2024. All rights reserved.