2017-02-01 53 views
2

我正在使用熊猫和python在excel中做一些工作。我有这样的事情。使用正则表达式在熊猫中过滤

ID   Actual Date 
738564  01/21/2016 
274628  02/12/2016 
571749  03/30/2016 
718563  10/01/2016 
984739  11/30/2016 
938511  12/24/2016 
103216  07/16/2014 
446754  08/06/2015 
135654  02/01/2017 
135614  01/16/2017 
133346  01/16/2011 
234682  N/A 
238756  (none) 

所以我需要按日期进行过滤,但我只需要2016年11月之前的一年日期过滤(所以我需要筛选2014年,2015年和月之间和2016年octuber)。所以基本上过滤器后,我都会有这样的事情

 ID  Actual Date 
    738564 01/21/2016 
    274628 02/12/2016 
    571749 03/30/2016 
    718563 10/01/2016 
    103216 07/16/2014 
    446754 08/06/2015 
    133346 01/16/2011 
    234682  N/A 
    238756  (none) 

代码i'm使用这就是:

regex = r"[0-9]{2}/[0-9]{2}/2016" 
df = pd.read_csv("Request.csv", keep_default_na=False) 
df1 = df.loc[(df["Actual Date"].str.contains(r'[0-9]{2}/[0-9]{2}/2016') & 
      (df["Actual Date"].str.contains("2015")) & 
      (df["Actual Date"].str.contains("2014")) & 
      (df["Actual Date"].str.contains("2011")) & 
      (df["Actual Date"].str.contains("(None)")) & 
      (df["Actual Date"].str.contains("N/A"))))]     

但是当我运行的代码,我只收到了2011年,2014年和正则表达式不适用于2016年的日期。 我会很感激的帮助,遗憾的英语不好

回答

2

正则表达式是非常强大的工具,但在这种情况下,有一个更好的方法:

In [180]: df 
Out[180]: 
     ID ActualDate 
0 738564 01/21/2016 
1 274628 02/12/2016 
2 571749 03/30/2016 
3 718563 10/01/2016 
4 984739 11/30/2016 
5 938511 12/24/2016 
6 103216 07/16/2014 
7 446754 08/06/2015 
8 135654 02/01/2017 
9 135614 01/16/2017 
10 133346 01/16/2011 
11 234682   NaN 
12 238756  (none) 

我们转换它datetime D型:

In [181]: df['ActualDate'] = pd.to_datetime(df['ActualDate'], errors='coerce') 

In [182]: df 
Out[182]: 
     ID ActualDate 
0 738564 2016-01-21 
1 274628 2016-02-12 
2 571749 2016-03-30 
3 718563 2016-10-01 
4 984739 2016-11-30 
5 938511 2016-12-24 
6 103216 2014-07-16 
7 446754 2015-08-06 
8 135654 2017-02-01 
9 135614 2017-01-16 
10 133346 2011-01-16 
11 234682  NaT 
12 238756  NaT 

过滤使用boolean indexing

In [184]: df[(df['ActualDate'] < '2016-11-01') | df['ActualDate'].isnull()] 
Out[184]: 
     ID ActualDate 
0 738564 2016-01-21 
1 274628 2016-02-12 
2 571749 2016-03-30 
3 718563 2016-10-01 
6 103216 2014-07-16 
7 446754 2015-08-06 
10 133346 2011-01-16 
11 234682  NaT 
12 238756  NaT 

过滤使用.query()方法:

In [186]: df.query("ActualDate < '2016-11-01' or ActualDate != ActualDate") 
Out[186]: 
     ID ActualDate 
0 738564 2016-01-21 
1 274628 2016-02-12 
2 571749 2016-03-30 
3 718563 2016-10-01 
6 103216 2014-07-16 
7 446754 2015-08-06 
10 133346 2011-01-16 
11 234682  NaT 
12 238756  NaT 

UPDATE:如果你想在字符串D型,以保留原始Date

In [190]: df 
Out[190]: 
     ID Actual Date 
0 738564 01/21/2016 
1 274628 02/12/2016 
2 571749 03/30/2016 
3 718563 10/01/2016 
4 984739 11/30/2016 
5 938511 12/24/2016 
6 103216 07/16/2014 
7 446754 08/06/2015 
8 135654 02/01/2017 
9 135614 01/16/2017 
10 133346 01/16/2011 
11 234682   NaN 
12 238756  (none) 

首先添加一个新的datetime列:

In [191]: df['Date'] = pd.to_datetime(df['Actual Date'], errors='coerce') 

In [192]: df 
Out[192]: 
     ID Actual Date  Date 
0 738564 01/21/2016 2016-01-21 
1 274628 02/12/2016 2016-02-12 
2 571749 03/30/2016 2016-03-30 
3 718563 10/01/2016 2016-10-01 
4 984739 11/30/2016 2016-11-30 
5 938511 12/24/2016 2016-12-24 
6 103216 07/16/2014 2014-07-16 
7 446754 08/06/2015 2015-08-06 
8 135654 02/01/2017 2017-02-01 
9 135614 01/16/2017 2017-01-16 
10 133346 01/16/2011 2011-01-16 
11 234682   NaN  NaT 
12 238756  (none)  NaT 

过滤:

In [194]: df.drop('Date', 1).loc[(df['Date'] < '2016-11-01') | df['Date'].isnull()] 
Out[194]: 
     ID Actual Date 
0 738564 01/21/2016 
1 274628 02/12/2016 
2 571749 03/30/2016 
3 718563 10/01/2016 
6 103216 07/16/2014 
7 446754 08/06/2015 
10 133346 01/16/2011 
11 234682   NaN 
12 238756  (none) 


In [196]: df.query("Date < '2016-11-01' or Date != Date").drop('Date', 1) 
Out[196]: 
     ID Actual Date 
0 738564 01/21/2016 
1 274628 02/12/2016 
2 571749 03/30/2016 
3 718563 10/01/2016 
6 103216 07/16/2014 
7 446754 08/06/2015 
10 133346 01/16/2011 
11 234682   NaN 
12 238756  (none) 
+0

好的,我认为最好的想法是将日期转换为日期时间,但是一些命运的值是None或NA,我也需要显示这个值。任何选项做到这一点,因为我认为datetime不接受字符串。 代码是这样的 –

+0

我对原始文章 –

+0

进行了更新@CarlosArronteBello,你想在结果数据集中(过滤之后)有那些行'Date'是'None'或'NaN'吗? – MaxU

相关问题