首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PerformanceWarning:在没有级别参数的非词汇排序多索引上放置可能会影响性能。怎么摆脱它?

PerformanceWarning:在没有级别参数的非词汇排序多索引上放置可能会影响性能。怎么摆脱它?
EN

Stack Overflow用户
提问于 2022-05-17 17:25:16
回答 1查看 1.9K关注 0票数 3

我有下面的代码

代码语言:javascript
运行
复制
 end_df['Soma Internet'] = end_df.iloc[:,end_df.columns.get_level_values(1) == 'Internet'].drop('site',axis=1).sum(axis=1)

基本上,它通过一个特定的级别1列来填充我的多个索引df。丢了几个不想要的专栏。计算出所有其他的总和。

我瞥了一眼,看了几个文档和其他提出的问题。但是我不太明白是什么引起了这个警告,我也很想重写这段代码,所以我把它去掉了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-17 17:46:51

让我们尝试使用一个示例(为了简单起见,没有数据):

代码语言:javascript
运行
复制
# Column MultiIndex.
idx = pd.MultiIndex(levels=[['Col1', 'Col2', 'Col3'], ['subcol1', 'subcol2']], 
                    codes=[[2, 1, 0], [0, 1, 1]])

df = pd.DataFrame(columns=range(len(idx)))
df.columns = idx
print(df)
代码语言:javascript
运行
复制
    Col3    Col2    Col1
subcol1 subcol2 subcol2

显然,列MultiIndex没有排序。我们可以通过以下方式检查:

代码语言:javascript
运行
复制
print(df.columns.is_monotonic)
代码语言:javascript
运行
复制
False

这很重要,因为如果索引被排序,Pandas执行索引查找和其他操作的速度要快得多,因为它可以使用假定排序顺序且速度更快的操作。事实上,如果我们试图删除一列:

代码语言:javascript
运行
复制
df.drop('Col1', axis=1)
代码语言:javascript
运行
复制
PerformanceWarning: dropping on a non-lexsorted multi-index without a level parameter may impact performance.
  df.drop('Col1', axis=1)

相反,如果在删除之前对索引进行排序,则警告将消失:

代码语言:javascript
运行
复制
print(df.sort_index(axis=1))

# Index is now sorted in lexical order.
    Col1    Col2    Col3
subcol2 subcol2 subcol1
代码语言:javascript
运行
复制
# No warning here.
df.sort_index(axis=1).drop('Col1', axis=1)

编辑(参见注释):正如警告所建议的那样,当我们没有指定要删除列的级别时,就会发生这种情况。这是因为要删除这一栏,熊猫必须遍历整个未排序的索引(发生这里)。通过指定它,我们不需要这样的遍历:

代码语言:javascript
运行
复制
# Also no warning.
df.drop('Col1', axis=1, level=0)

但是,通常情况下,这个问题更多地与行索引有关,因为通常列多个索引要小得多。但一定要记住更大的指数和数据。实际上,这与按索引划分和查找特别相关。在这些情况下,您希望对索引进行排序以获得更好的性能。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72278311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档