Pandas,如何使用多索引数据帧的子集删除值?

kbr*_*r85 6 nan python-3.x pandas

我有一个带有多索引列的数据框。

我需要从此数据框中删除列子集中具有 NaN 值的行。

我正在尝试使用subset选项pd.dropna,但我无法找到指定列子集的方法。我尝试过使用pd.IndexSlice但这不起作用。

在下面的示例中,我需要乘坐最后一排。

import pandas as pd

# ---
a = [1, 1, 2, 2, 3, 3]
b = ["a", "b", "a", "b", "a", "b"]
col = pd.MultiIndex.from_arrays([a[:], b[:]])
val = [
    [1, 2, 3, 4, 5, 6],
    [None, None, 1, 2, 3, 4],
    [None, 1, 2, 3, 4, 5],
    [None, None, 5, 3, 3, 2],
    [None, None, None, None, 5, 7],
]
# ---
df = pd.DataFrame(val, columns=col)
# ---
print(df)
# ---
idx = pd.IndexSlice
df.dropna(axis=0, how="all", subset=idx[1:2, :])
# ---
print(df)
Run Code Online (Sandbox Code Playgroud)

使用该thresh选项是一种替代方法,但如果可能的话我想使用subsethow='all'

unu*_*tbu 4

处理 MultiIndex 时,MultiIndex 的每一列都可以指定为一个元组:

In [67]: df.dropna(axis=0, how="all", subset=[(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')])
Out[67]: 
     1         2       3   
     a    b    a    b  a  b
0  1.0  2.0  3.0  4.0  5  6
1  NaN  NaN  1.0  2.0  3  4
2  NaN  1.0  2.0  3.0  4  5
3  NaN  NaN  5.0  3.0  3  2
Run Code Online (Sandbox Code Playgroud)

或者,要选择第一级等于1或的所有列2,您可以使用:

In [69]: df.dropna(axis=0, how="all", subset=df.loc[[], [1,2]].columns)
Out[69]: 
     1         2       3   
     a    b    a    b  a  b
0  1.0  2.0  3.0  4.0  5  6
1  NaN  NaN  1.0  2.0  3  4
2  NaN  1.0  2.0  3.0  4  5
3  NaN  NaN  5.0  3.0  3  2
Run Code Online (Sandbox Code Playgroud)

df[[1,2]].columns也有效,但这会返回一个(可能很大)中间 DataFrame。df.loc[[], [1,2]].columns由于其中间 DataFrame 为空,因此内存效率更高。