我有一个多列级数据框。我需要删除所有没有名称的列级别(即
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
你可以这样做:
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)
使用
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
``