据我所知,在一个多索引的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