我有下面的代码
end_df['Soma Internet'] = end_df.iloc[:,end_df.columns.get_level_values(1) == 'Internet'].drop('site',axis=1).sum(axis=1)
基本上,它通过一个特定的级别1列来填充我的多个索引df。丢了几个不想要的专栏。计算出所有其他的总和。
我瞥了一眼,看了几个文档和其他提出的问题。但是我不太明白是什么引起了这个警告,我也很想重写这段代码,所以我把它去掉了。
发布于 2022-05-17 17:46:51
让我们尝试使用一个示例(为了简单起见,没有数据):
# 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)
编辑(参见注释):正如警告所建议的那样,当我们没有指定要删除列的级别时,就会发生这种情况。这是因为要删除这一栏,熊猫必须遍历整个未排序的索引(发生这里)。通过指定它,我们不需要这样的遍历:
# Also no warning.
df.drop('Col1', axis=1, level=0)
但是,通常情况下,这个问题更多地与行索引有关,因为通常列多个索引要小得多。但一定要记住更大的指数和数据。实际上,这与按索引划分和查找特别相关。在这些情况下,您希望对索引进行排序以获得更好的性能。
https://stackoverflow.com/questions/72278311
复制相似问题