gpt4 book ai didi

python - PerformanceWarning : dropping on a non-lexsorted multi-index without a level parameter may impact performance. 如何摆脱它?

转载 作者:行者123 更新时间:2023-12-05 01:51:22 25 4
gpt4 key购买 nike

我有下面这行代码

 end_df['Soma Internet'] = end_df.iloc[:,end_df.columns.get_level_values(1) == 'Internet'].drop('site',axis=1).sum(axis=1)

基本上,它通过特定的 1 级列过滤我的多索引 df。删除一些不需要的列。并计算所有其他项的总和。

我浏览了一些文档和其他问题。但我不太明白是什么原因导致警告,我也很想重写这段代码,所以我去掉了它。

最佳答案

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

# 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)
    Col3    Col2    Col1
subcol1 subcol2 subcol2

很明显,MultiIndex 列没有排序。我们可以检查它:

print(df.columns.is_monotonic)
False

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

df.drop('Col1', axis=1)
PerformanceWarning: dropping on a non-lexsorted multi-index without a level parameter may impact performance.
df.drop('Col1', axis=1)

相反,如果我们在删除之前对索引进行排序,警告就会消失:

print(df.sort_index(axis=1))

# Index is now sorted in lexical order.
Col1 Col2 Col3
subcol2 subcol2 subcol1
# No warning here.
df.sort_index(axis=1).drop('Col1', axis=1)

编辑(见评论):正如警告所暗示的,当我们没有指定要删除列的级别时会发生这种情况。这是因为要删除该列,pandas 必须遍历整个未排序的索引(发生 here )。通过指定它,我们不需要这样的遍历:

# Also no warning.
df.drop('Col1', axis=1, level=0)

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

关于python - PerformanceWarning : dropping on a non-lexsorted multi-index without a level parameter may impact performance. 如何摆脱它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72278311/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com