如何在不调整MultiIndex DataFrame列顺序的情况下规避lexsort警告?
解决MultiIndex DataFrame的PerformanceWarning问题(保留原列顺序)
方案一:临时抑制警告
如果不想修改列顺序,最直接的方式是临时屏蔽这个性能警告,且不会影响其他功能。推荐用上下文管理器实现局部生效,避免全局屏蔽所有警告:
import pandas as pd import warnings 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) # 临时屏蔽PerformanceWarning with warnings.catch_warnings(): warnings.filterwarnings("ignore", category=pd.errors.PerformanceWarning) df.loc[:, ("col_B", "col_B.2",)] = 7 # 此处不再触发警告 print(df)
若需全局屏蔽该警告(不推荐,可能错过其他重要性能提示),可在代码开头添加:
import warnings import pandas as pd warnings.filterwarnings("ignore", category=pd.errors.PerformanceWarning)
方案二:临时排序列后恢复原顺序
如果不想屏蔽警告,可通过临时排序列、完成操作后恢复原顺序的方式规避警告:
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) # 1. 保存原始列顺序 original_columns = df.columns.copy() # 2. 对列进行排序,消除警告触发条件 df_sorted = df.sort_index(axis=1) # 3. 在排序后的DataFrame上执行赋值操作 df_sorted.loc[:, ("col_B", "col_B.2",)] = 7 # 4. 恢复原始列顺序 df = df_sorted[original_columns] print(df)
说明
- 方案一无需修改数据结构,完全保留原列顺序,适合快速解决警告问题。
- 方案二通过临时排序规避性能警告,同时保证最终输出的列顺序与原始一致,适合对警告零容忍但需保留列顺序的场景。
内容的提问来源于stack exchange,提问作者Tfovid
相关产品推荐
相关产品推荐

