我有一个这样的数据框:
StringCol Timestamp GroupID Flag
xyz 20170101 123 yes
abc 20170101 123 yes
def 20170101 123 yes
ghi 20170101 123 no
abc 20170101 124 yes
jkl 20170101 124 yes
pqr 20170101 124 no
klm 20170101 124 yes
我想按GroupID对此分组,对于每个组,我希望标记为“ no”的行和X之前的行数为X(数据帧已按GroupID和Timestamp排序)。
所以,如果X = 2,我希望结果是这样的:
StringCol Timestamp GroupID Flag
abc 20170101 123 yes
def 20170101 123 yes
ghi 20170101 123 no
abc 20170101 124 yes
jkl 20170101 124 yes
pqr 20170101 124 no
我该如何实现?谢谢。
答案 0 :(得分:2)
这将获得每组最后一个标志的前X个项目。
def prevK(x):
i = x.reset_index(drop=True).Flag.eq('no').iloc[::-1].idxmax()
return x.iloc[i - 2:i + 1, :]
df.groupby('GroupID', group_keys=False).apply(prevK)
StringCol Timestamp GroupID Flag
1 abc 20170101 123 yes
2 def 20170101 123 yes
3 ghi 20170101 123 no
4 abc 20170101 124 yes
5 jkl 20170101 124 yes
6 pqr 20170101 124 no
答案 1 :(得分:1)
如果您只需要组中的最后一位,请尝试drop_duplicates
df1=df.copy()
df=df[df['Flag'].eq('no')].drop_duplicates(['GroupID'],keep='last')
idx=df.index+1
idy=df.index-2
import itertools
df1.loc[list(itertools.chain(*[list(range(y,x)) for x , y in zip(idx,idy)]))]
Out[512]:
StringCol Timestamp GroupID Flag
1 abc 20170101 123 yes
2 def 20170101 123 yes
3 ghi 20170101 123 no
4 abc 20170101 124 yes
5 jkl 20170101 124 yes
6 pqr 20170101 124 no