【问题标题】:Exclude a specific date based on a condition using pandas使用 pandas 根据条件排除特定日期
【发布时间】:2020-10-19 11:27:56
【问题描述】:
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 31stJan 1st,则从数据框中排除/过滤记录。请注意year 无关紧要。

如果主题有Dec 31stJan 1st,我们保持原样

但如果他们同时拥有 Dec 31stJan 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-3101-01,而对于 person_id = 14,我们不删除 12-31,因为它的记录中只有 12-31记录。

仅当 12-3101-01 都出现在某人的记录中时,我们才会删除 12-31

【问题讨论】:

  • 是否可以为 31.12 和 1.1 对添加更通用的解决方案?

标签: python python-3.x pandas dataframe pandas-groupby


【解决方案1】:

另一种方式

将日期强制转换为月份。 创建将31st Dec 转换为1st Jan 的临时列 删除重复的 Person idtemp column 保持第一。

 df2['dates']=df2['dates'].dt.strftime('%d %b')
df2=df2.assign(check=np.where(df2.dates=='31 Dec','01 Jan', df2.dates)).drop_duplicates(['person_id', 'variable', 'check'], keep='first').drop(columns=['check'])



 person_id    variable   dates   check
0          11  admit_date  01 Jan  01 Jan
4          11  admit_date  03 Apr  03 Apr
5          12  admit_date  04 Aug  04 Aug
6          12  admit_date  05 Mar  05 Mar
7          13  admit_date  07 Feb  07 Feb
8          13  admit_date  08 Aug  08 Aug
9          14  admit_date  31 Dec  01 Jan
10         14  admit_date  01 May  01 May
11         14  admit_date  21 May  21 May
12         14  admit_date  12 Jul  12 Jul

【讨论】:

  • 对于主题 11,我们应该能够看到另一个 jan 1st 记录,如预期的输出所示。为响应投票
  • 请 calriffy,你能接受任何其他日期吗,重复说 5 月 2 日
  • 请问为什么会有重复的问题?
  • 我有逻辑来实现你所需要的。您想按照上面给出的说明删除日期。在您的数据集中,是否有可能重复其他日期?
  • 如果您询问我的数据集中的日期是否可以重复。是的,同一主题可以重复。
【解决方案2】:

用途:

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

【讨论】:

猜你喜欢
  • 2022-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多