据我所知,在一个多索引的Pandas 数据帧中有大约performance rationale个用于对列(或索引)进行排序的方法.但是,我有自己的"用户界面"原因来 Select 列的特定顺序.有没有办法避免出现以下警告,而不必更改列的顺序?

PerformanceWarning: indexing past lexsort depth may impact performance.

如果不可能以一种干净的方式完成,是否至少有一些方法可以暂时对列进行排序,然后将它们的顺序重新安排到操作之前的状态?

以下是一些自包含的代码:

import pandas as pd

N = 3
rangeN = list(range(1, N + 1))
index = pd.MultiIndex.from_product(
    [rangeN, rangeN], names=["level1", "level2"]
)
columns = [
    (
        "col_B",
        "col_B.1",
    ),
    (
        "col_B",
        "col_B.2",
    ),
]
components = range(1, 3)
columns += [("col_A", "col_A.1", f"col_A.1.{c}") for c in components]
columns += [("col_A", "col_A.2", f"col_A.2.{c}") for c in components]
columns = pd.MultiIndex.from_tuples(columns)
df = pd.DataFrame(columns=columns, index=index)

df.loc[:, ("col_B", "col_B.2",)] = 7  # Warning thrown here

print(df)

它返回

                col_B             col_A                              
              col_B.1 col_B.2   col_A.1             col_A.2          
                  NaN     NaN col_A.1.1 col_A.1.2 col_A.2.1 col_A.2.2
level1 level2                                                        
1      1          NaN       7       NaN       NaN       NaN       NaN
       2          NaN       7       NaN       NaN       NaN       NaN
       3          NaN       7       NaN       NaN       NaN       NaN
2      1          NaN       7       NaN       NaN       NaN       NaN
       2          NaN       7       NaN       NaN       NaN       NaN
       3          NaN       7       NaN       NaN       NaN       NaN
3      1          NaN       7       NaN       NaN       NaN       NaN
       2          NaN       7       NaN       NaN       NaN       NaN
       3          NaN       7       NaN       NaN       NaN       NaN
c:\users\tfovid\draft.py:31: PerformanceWarning: indexing past lexsort depth may impact performance.
  df.loc[:, ("col_B", "col_B.2",)] = 7

推荐答案

我看到您在列索引中有3个级别,因此将slice(None)加到.loc会有所帮助:

df.loc[:, ("col_B", "col_B.2", slice(None))] = 7
print(df)

在没有警告的情况下打印:

                col_B             col_A                              
              col_B.1 col_B.2   col_A.1             col_A.2          
                  NaN     NaN col_A.1.1 col_A.1.2 col_A.2.1 col_A.2.2
level1 level2                                                        
1      1          NaN       7       NaN       NaN       NaN       NaN
       2          NaN       7       NaN       NaN       NaN       NaN
       3          NaN       7       NaN       NaN       NaN       NaN
2      1          NaN       7       NaN       NaN       NaN       NaN
       2          NaN       7       NaN       NaN       NaN       NaN
       3          NaN       7       NaN       NaN       NaN       NaN
3      1          NaN       7       NaN       NaN       NaN       NaN
       2          NaN       7       NaN       NaN       NaN       NaN
       3          NaN       7       NaN       NaN       NaN       NaN

Python相关问答推荐

提取两行之间的标题的常规表达

更改matplotlib彩色条的字体并勾选标签?

Python在tuple上操作不会通过整个单词匹配

ModuleNotFound错误:没有名为flags.State的模块; flags不是包

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

使用setuptools pyproject.toml和自定义目录树构建PyPi包

Python—从np.array中 Select 复杂的列子集

移动条情节旁边的半小提琴情节在海运

无法连接到Keycloat服务器

通过ManyToMany字段与Through在Django Admin中过滤

BeautifulSoup:超过24个字符(从a到z)的迭代失败:降低了首次深入了解数据集的复杂性:

从一个df列提取单词,分配给另一个列

如何合并具有相同元素的 torch 矩阵的行?

当HTTP 201响应包含 Big Data 的POST请求时,应该是什么?  

有了Gekko,可以创建子模型或将模型合并在一起吗?

设置索引值每隔17行左右更改的索引

为什么我的scipy.optimize.minimize(method=";newton-cg";)函数停留在局部最大值上?

查找数据帧的给定列中是否存在特定值

将Pandas DataFrame中的列名的长文本打断/换行为_STRING输出?

Pandas:根据相邻行之间的差异过滤数据帧