我的理解是
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'])
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'])