gpt4 book ai didi

python - 使用分层索引(MultiIndex)快速选择和分配

转载 作者:太空宇宙 更新时间:2023-11-03 15:31:46 25 4
gpt4 key购买 nike

我在 Pandas 中处理一个大型数据集(超过 18000000 行,8 列)并且想将某些行中的其中一列分配给 True。我使用分层索引并将我的 DataFrame 结构化如下:

                    col1       col2       ...     col8     
name position
"name2" 1 False -0.827317 0.569605
2 False -0.273178 0.997953
3 False -0.827317 0.569605
... ... ... ... ...
15000 False -0.827317 0.569605
15001 False -0.001015 0.569605
"name2" 1 False -0.827317 0.827317
2 False -0.827317 0.569605
3 False -0.827317 0.001015
... ... ... ... ...
15000 False -0.827317 0.569605
15001 False -0.998997 0.569605
"name3" 1 False -0.827317 0.569605
2 False -0.827317 0.000000
3 False -0.827317 0.569605
... ... ... ... ...
15000 False -0.998997 0.569605
15001 False -0.827317 0.998997

... ... ... ... ... ...

我想根据之前在 col1 中的计算为 true 分配某些位置。我想对我的“名称”索引中的所有索引执行此操作。

所以首先我尝试使用这个元组索引来选择正确的行。

df.loc[(all_names, positions), 'col1'] = True

它可以工作,但是速度非常慢,这使得它在实践中无法使用。我尝试在 Jupyter Notebook 中计时,但当我使用 %%timeit 时 iPython 内核崩溃了。

然后我尝试使用这段代码:

for name in all_names: 
df.loc[name].loc[positions, 'col1'] = True

令我惊讶的是,它至少快了 10 倍。我知道使用 df.loc[].loc[] = True 不是解决此问题的合适方法,因为 A value is trying to be set on a copy of a slice from一个 DataFrame。 但它实际上按我想要的方式工作,并且设置了所有正确的值。但是还是很慢(整个数据集大约需要1分钟)

我认为迭代所有名称肯定不是最快的方法,所以我尝试使用切片器

df.loc[(slice(None), positions), 'col1'] = True

但它的表现与我的第一次尝试相同。

使用分层索引选择和分配特定值的最佳和最快方法是什么?当想在第一级使用所有索引然后在第二级仅使用一些索引时。

最佳答案

由于要选择 multiIndex 的每个 name 部分,可能会尝试通过 get_level_values(1) 进行索引,其中 (1) 表示 position:

df.loc[df.index.get_level_values(1).isin(positions), 'col1'] = True

尝试看看是否能提供任何加速。

关于python - 使用分层索引(MultiIndex)快速选择和分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57610473/

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