如果子索引的列值符合条件,则从多索引数据帧中删除索引

2024-04-26 22:59:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我最初问过这个问题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=2中对应于索引值1的列'Val2'的值大于该level=1索引的5,我希望保留一个特定的level=1索引(例如'a')。因此,如果不满足此条件(即'Val2'列小于或等于5中的索引1),则相应的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])

这确实产生了我想要的输出,但是对于一个有100000行的数据帧来说,性能相当差。我在这里是否缺少一些明显的东西来更好地利用pandas的引擎盖下优化?你知道吗


Tags: 数据importpandasindexlenasnplevel
1条回答
网友
1楼 · 发布于 2024-04-26 22:59:40

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

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

与时间性能相比,这大约快15倍(在我的机器中,您的示例需要36毫秒,而这需要2毫秒)。你知道吗

相关问题 更多 >