Python Dataframe:通过比较其他列的值来清理一列的数据

时间:2017-10-27 01:34:19

标签: python pandas numpy

对我来说另一个具有挑战性的问题,但也许对你来说很容易。我只是不知道怎么用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

谢谢大家伙

1 个答案:

答案 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