对我来说另一个具有挑战性的问题,但也许对你来说很容易。我只是不知道怎么用pythony方式思考;
我有一个数据框:
dt={'Name':['A','A','B','B','C','D','D'],'FG':['N','Y','N','Y','N','N','N'], 'Date':[2016,2017,2017,2016,2017,2017,2017]}
df = pd.DataFrame(data = dt,columns = ['Name','FG','Date'))
我想要做的是,对于“名称”中的每个名称(可以重复),检查“FG”中的标志值,如果设置为“Y”并且与之关联的日期大于与“N”相关联的一个我将保留该条目,否则我将丢弃它。由于缺乏经验,我无法真正想到编写此代码的方法。在这里可视化是我拥有的
Name FG Date
A N 2016
A Y 2017
B N 2017
B Y 2016
C Y 2017
D N 2017
D N 2017
这是我想要回归的内容
Name FG Date
A Y 2017
C Y 2017
谢谢大家伙
答案 0 :(得分:1)
再添加一列恢复组内的max
值。
df['check']=df.groupby('Name').Date.transform('max')
df.loc[(df.check==df.Date)&(df.FG=='Y'),:]
Out[786]:
Name FG Date check
1 A Y 2017 2017
4 C Y 2017 2017
编辑:
mask=df.groupby('Name').\
apply(lambda x : (x.FG=='Y')&(x.Date>min(x.Date)) if len(x.Date)>1 else (x.FG=='Y')).values
df[mask]
Out[808]:
Name FG Date
1 A Y 2017
4 C Y 2017
数据输入
df
Out[809]:
Name FG Date
0 A N 2016
1 A Y 2017
2 B N 2017
3 B Y 2016
4 C Y 2017
5 D N 2017
6 D N 2017
7 E Y 2017
8 E N 2017