我最初问过这个问题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
的引擎盖下优化?你知道吗
通过执行以下操作,我得到了与示例解决方案相同的结果:
与时间性能相比,这大约快15倍(在我的机器中,您的示例需要36毫秒,而这需要2毫秒)。你知道吗
相关问题 更多 >
编程相关推荐