我的理解是MultiIndex.dropna()删除至少一个级别为NaN的索引条目,没有任何条件.然而,如果之前的groupbydropna=False一起使用,那么就不能再使用MultiIndex.dropna()了.

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

(我知道,如果没有dropna参数,NaN个组将被groupby删除,但我正在寻找一种在早些时候使用该参数的情况下工作的解决方案).


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'])

推荐答案

查看sources of pd.MultiIndex.dropna()就会发现,每个指数值都有codes.

Pandas期望NaN的代码值为-1,但在执行.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'])

Python相关问答推荐

如何调整spaCy token 化器,以便在德国模型中将数字拆分为行末端的点

Matlab中是否有Python的f-字符串等效物

Python 约束无法解决n皇后之谜

将输入管道传输到正在运行的Python脚本中

C#使用程序从Python中执行Exec文件

当从Docker的--env-file参数读取Python中的环境变量时,每个\n都会添加一个\'.如何没有额外的?

Python解析整数格式说明符的规则?

无法使用DBFS File API路径附加到CSV In Datricks(OSError Errno 95操作不支持)

如何在UserSerializer中添加显式字段?

根据列值添加时区

不能使用Gekko方程'

为什么在FastAPI中创建与数据库的连接时需要使用生成器?

如果包含特定值,则筛选Groupby

Pandas—MultiIndex Resample—我不想丢失其他索引的信息´

递归函数修饰器

使用类型提示进行类型转换

将CSS链接到HTML文件的问题

如何在Django模板中显示串行化器错误

将相应的值从第2列合并到第1列(Pandas )

来自任务调度程序的作为系统的Python文件