gpt4 book ai didi

python - 如果子索引的列值满足条件,则从 MultiIndex 数据框中删除索引

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

我最初问过这个问题here ,并且我相信它被错误地标记为重复项。我将尽力在这里澄清我的问题以及我如何相信它是独一无二的。

给出以下示例 MultiIndex 数据帧:

import pandas as pd
import numpy as np

first = ['A', 'B', 'C']
second = ['a', 'b', 'c', 'd']
third = ['1', '2', '3']

indices = [first, second, third]

index = pd.MultiIndex.from_product(indices, names=['first', 'second', 'third'])

df = pd.DataFrame(np.random.randint(10, size=(len(first)*len(second)*len(third), 4)), index=index, columns=['Val1','Val2',' Val3', 'Val4'])

目标:如果列的值<,我想保留特定的level=1索引(例如'a')对于该 level=,level=2 中对应于索引值 1 的 code>'Val2' 大于 5 1 索引。因此,如果不满足此条件(即 level 中索引 1 的列 'Val2' 小于或等于 5 =2),那么相应的 level=1 索引将从数据帧中删除。如果所有 level=1 索引都不满足给定 level=0 索引的条件,则该 level=0 索引也将被删除。我的上一篇文章包含了我的预期输出(我可以在此处添加它,但为了清晰起见,我希望这篇文章尽可能简洁)。

这是我当前的解决方案,我确信其性能可以改进:

grouped = df.groupby(level=0)

output = pd.concat([grouped.get_group(key).groupby(level=1).filter(lambda x: (x.loc[pd.IndexSlice[:, :, '1'], 'Val2']>5).any()) for key, group in grouped])

这确实产生了我想要的输出,但是对于具有 100,000 行的数据帧,性能相当差。为了更好地利用 pandas 的底层优化,我是否缺少一些明显的东西?

最佳答案

通过执行以下操作,我得到了与示例解决方案相同的结果:

df.loc[df.xs('1', level=2)['Val2'] > 5]

比较时间性能,这大约快了 15 倍(在我的机器中,您的示例需要 36 毫秒,而这个需要 2 毫秒)。

关于python - 如果子索引的列值满足条件,则从 MultiIndex 数据框中删除索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52417304/

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