为什么带有 dropna=False 的 groupby 会阻止后续的 MultiIndex.dropna() 工作?

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

我的理解是

MultiIndex.dropna()
删除至少一级为
NaN
的索引条目,没有条件。然而,如果之前的
groupby
dropna=False
一起使用,则似乎不再可能使用
MultiIndex.dropna()

  • 不同行为的原因是什么?
  • 使用
    NaN
    后如何删除
    groupby
    条目?

(我知道如果没有

NaN
参数,
groupby
组将被
dropna
删除,但我正在寻找一种在该参数已在早些时候使用过的情况下工作的解决方案)。


import pandas as pd
import numpy as np

d = {(8.0, 8.0): {'A': -1.10, 'B': -1.0},
     (7.0, 8.0): {'A': -0.10, 'B': 0.1},
     (5.0, 8.0): {'A': 1.15, 'B': -1.2},
     (7.0, 7.0): {'A': 1.10, 'B': 1.6},
     (7.0, np.NaN): {'A': 0.70, 'B': -0.7},
     (8.0, np.NaN): {'A': -1.00, 'B': 0.9},
     (np.NaN, 5.0): {'A': -2.20, 'B': 1.1}}

# This works as expected
index = pd.MultiIndex.from_tuples(d.keys(), names=['L1', 'L2'])
df = pd.DataFrame(d.values(), index=index)
print(df.index.dropna())

# This doesn't work as expected
df = df.groupby(['L1', 'L2'], dropna=False).mean()
print(df.index.dropna())

MultiIndex([(8.0, 8.0),
            (7.0, 8.0),
            (5.0, 8.0),
            (7.0, 7.0)],
           names=['L1', 'L2'])

MultiIndex([(5.0, 8.0),
            (7.0, 7.0),
            (7.0, 8.0),
            (7.0, nan),
            (8.0, 8.0),
            (8.0, nan),
            (nan, 5.0)],
           names=['L1', 'L2'])
python pandas multi-index
1个回答
0
投票

查看 pd.MultiIndex.dropna()

 来源发现,每个索引值都有 
codes

Pandas 期望

-1
的代码值为
NaN
,但在执行
.groupby()
时显然不是这种情况(一个错误?)。

您可以通过重建索引然后删除 NaN 值来避免此问题,例如:

df = df.groupby(["L1", "L2"], dropna=False).mean()

# reconstruct the index (this will assign code -1 to NaN):
df.index = pd.MultiIndex.from_tuples(df.index.to_list(), names=df.index.names)

print(df.index.dropna())

打印:

MultiIndex([(5.0, 8.0),
            (7.0, 7.0),
            (7.0, 8.0),
            (8.0, 8.0)],
           names=['L1', 'L2'])
© www.soinside.com 2019 - 2024. All rights reserved.