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