df2 = pd.DataFrame({'person_id':[11,11,11,11,11,12,12,13,13,14,14,14,14],
'admit_date':['01/01/2011','01/01/2009','12/31/2013','12/31/2017','04/03/2014','08/04/2016',
'03/05/2014','02/07/2011','08/08/2016','12/31/2017','05/01/2011','05/21/2014','07/12/2016']})
df2 = df2.melt('person_id', value_name='dates')
df2['dates'] = pd.to_datetime(df2['dates'])
我想做的是
a)如果主题具有Dec 31st
和Jan 1st
在其记录中,则从数据框中排除/过滤记录。请注意,year
没关系。
如果一个对象具有两种Dec 31st
或者Jan 1st
,我们让他们为是。
但是,如果它们同时具有Dec 31st
和Jan 1st
,我们将删除其中的一个(12月31日或1月1日)。请注意,他们也可能有多个具有相同日期的条目。喜欢person_id = 11
我只能做以下
df2_new = df2['dates'] != '2017-12-31' #but this excludes if a subject has only `Dec 31st on 2017`. How can I ignore the dates and not consider `year`
df2[df2_new]
我的预期输出如下所示
对于为person_id = 11,我们放弃12-31
,因为它有两个12-31
,并01-01
在他们的记录,而对于为person_id = 14,我们不降12-31
,因为它只有12-31
在它的记录。
我们12-31
只有在两者12-31
同时01-01
出现时才会掉落,并出现在一个人的记录中。
采用:
s = df2['dates'].dt.strftime('%m-%d')
m1 = s.eq('01-01').groupby(df2['person_id']).transform('any')
m2 = s.eq('12-31').groupby(df2['person_id']).transform('any')
m3 = np.select([m1 & m2, m1 | m2], [s.ne('12-31'), True], default=True)
df3 = df2[m3]
结果:
# print(df3)
person_id variable dates
0 11 admit_date 2011-01-01
1 11 admit_date 2009-01-01
4 11 admit_date 2014-04-03
5 12 admit_date 2016-08-04
6 12 admit_date 2014-03-05
7 13 admit_date 2011-02-07
8 13 admit_date 2016-08-08
9 14 admit_date 2017-12-31
10 14 admit_date 2011-05-01
11 14 admit_date 2014-05-21
12 14 admit_date 2016-07-12
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句