gpt4 book ai didi

python - 如果一行满足条件,则从 pandas 数据框中删除级别及其所有行

转载 作者:行者123 更新时间:2023-11-30 22:17:29 25 4
gpt4 key购买 nike

下面是我想要过滤的 pandas 数据框。当该年至少一行(即 visit)的温度 < 37 时,我想删除该年份及其所有行。我能够删除 2014 年的特定行,其中温度为36;可是,我不知道怎样才能让这一整年过去。

index = pd.MultiIndex.from_product([[2013, 2014], [1, 2]], names=['yr', 
'visit'])
columns = pd.MultiIndex.from_product(['hr', 'temp'], names=['metric'])
data = pd.DataFrame([[96, 38], [98, 38], [85, 36], [84, 43]], index=index,
columns=columns)
data

metric hr temp
yr visit
2013 1 96 38
2 98 38
2014 1 85 36
2 84 43

期望的输出:

        metric  hr      temp    
yr visit
2013 1 96 38
2 98 38

最佳答案

您可以使用groupby/filter根据条件删除组:

import numpy as np
import pandas as pd

index = pd.MultiIndex.from_product([[2013, 2014], [1, 2]], names=['yr', 'visit'])
columns = pd.MultiIndex.from_product([['hr', 'temp']], names=['metric'])
data = pd.DataFrame([[96, 38], [98, 38], [85, 36], [84, 43]], index=index, columns=columns)

print(data.groupby(level='yr').filter(lambda x: (x['temp']>=37).all()))

产量

metric      hr temp
yr visit
2013 1 96 38
2 98 38

由于您要删除的行按 yr 分组,并且 yr 是索引的级别,因此请使用 groupby(level='yr') 。对于每个组,都会调用 lambda 函数,并将 x 设置为子 DataFrame 组。当以下情况时,该组被保留:(x['temp']>=37).all())True

<小时/>

请注意Wen's suggestion ,

data.loc[(data['temp']>=37).groupby(level='yr').transform('all')]

更快,特别是对于大型 DataFrame,因为 data['temp']>=37 以矢量化方式计算整个列的标准,而在我的解决方案中上面,(x['temp']>=37).all() 以分段方式分别为每个子 DataFrame 计算标准。一般来说,矢量化解决方案在应用于大型数组或 NDFrame 时速度更快,而不是应用于较小部分的循环。

以下示例显示了 1000 行 DataFrame 的速度差异:

In [70]: df = pd.DataFrame(np.random.randint(100, size=(1000, 4)), columns=list('ABCD')).set_index(['A','B'])

In [71]: %timeit df.groupby(level='A').filter(lambda x: (x['C']>=5).all())
10 loops, best of 3: 46.3 ms per loop

In [72]: %timeit df.loc[(df['C']>=37).groupby(level='A').transform('all')]
100 loops, best of 3: 18.9 ms per loop

关于python - 如果一行满足条件,则从 pandas 数据框中删除级别及其所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49638955/

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