Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫:基于另一个数据帧中每个数据帧的最后一行的条件筛选_Python_Pandas - Fatal编程技术网

Python 熊猫:基于另一个数据帧中每个数据帧的最后一行的条件筛选

Python 熊猫:基于另一个数据帧中每个数据帧的最后一行的条件筛选,python,pandas,Python,Pandas,我有一个数据帧df,如下所示 Date Group Value Duration 2018-01-01 A 20 30 2018-02-01 A 10 60 2018-03-01 A 25 88 <-----Last row for Group A 2018-01-01 B 15 180 2018-02-01 B

我有一个数据帧
df
,如下所示

Date          Group   Value   Duration
2018-01-01      A      20       30
2018-02-01      A      10       60
2018-03-01      A      25       88    <-----Last row for Group A
2018-01-01      B      15      180
2018-02-01      B      30      210
2018-03-01      B      25      238    <-----Last row of Group B
为此,我的方法如下:

df_f = []
for k,v in df.groupby(['Group']):
    v_f = v[max(v['Duration'])>=90]
    df_f.append(v_f)
上面的代码段抛出了一个错误,错误为
KeyError:False


我是不是遗漏了什么

您可以测试每组的最大值是否相等,如中的
90
,然后通过以下方式进行过滤:

编辑:我建议不要使用
filter
对每组进行过滤,因为速度慢:

#1k rows
np.random.seed(123)
N = 1000
df = pd.DataFrame({'Group': np.random.randint(100, size=N),
                   'Duration':np.random.randint(200,size=N)})

#print (df)

In [24]: %timeit df.groupby('Group').filter(lambda x: x.Duration.max()>=90)
39.8 ms ± 1.15 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [25]: %timeit df[df.groupby('Group')['Duration'].transform('max') >= 90]
3.12 ms ± 37.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)


您也可以使用过滤器

df.groupby('Group').filter(lambda x: x.Duration.max()>=90)

    Date        Group   Value   Duration
3   2018-01-01  B       15      180
4   2018-02-01  B       30      210
5   2018-03-01  B       25      238

@jezrael:是的,筛选操作有点慢,但考虑到实际数据的大小,我认为不会有太大影响。好的,在小数据帧、1k行中,筛选速度很慢,但这取决于您。@jazrel:如何根据日期列进行筛选?这是基于df中的
最后一个日期,如果持续时间>=90,则为1,否则为0。
@pythondumb-为您的新问题添加了解决方案。
#1k rows
np.random.seed(123)
N = 1000
df = pd.DataFrame({'Group': np.random.randint(100, size=N),
                   'Duration':np.random.randint(200,size=N)})

#print (df)

In [24]: %timeit df.groupby('Group').filter(lambda x: x.Duration.max()>=90)
39.8 ms ± 1.15 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [25]: %timeit df[df.groupby('Group')['Duration'].transform('max') >= 90]
3.12 ms ± 37.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
#100k rows
np.random.seed(123)
N = 100000
df = pd.DataFrame({'Group': np.random.randint(1000, size=N),
                   'Duration':np.random.randint(200,size=N)})

#print (df)


In [29]: %timeit df[df.groupby('Group')['Duration'].transform('max') >= 90]
11.8 ms ± 153 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [30]: %timeit df.groupby('Group').filter(lambda x: x.Duration.max()>=90)
394 ms ± 8.92 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
df.groupby('Group').filter(lambda x: x.Duration.max()>=90)

    Date        Group   Value   Duration
3   2018-01-01  B       15      180
4   2018-02-01  B       30      210
5   2018-03-01  B       25      238