2017-02-01 6 views
2

Ich mache einige Arbeit in Excel mit Pandas und Python. Ich habe so etwas.Filtern in Pandas mit Regex-Ausdruck

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) 

Also muß ich nach Datum filtern, aber ich brauche nur die Jahreszahl vor 2016 November filtern (also muß ich 2014 filtern, 2015 und zwischen Januar und Octuber von 2016). Also im Grunde nach dem Filter ich so etwas wie dieses für diese haben

 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) 

Der Code Ich bin mit ist:

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"))))]     

Aber wenn ich den Code ausführen, empfange ich nur die 2011, 2014 und 2015. Der reguläre Ausdruck funktioniert nicht für die Daten 2016. Ich werde wirklich die Hilfe zu schätzen weiß, und sorry für das schlechte Englisch

Antwort

2

RegEx ist sehr mächtiges Werkzeug, aber in diesem Fall gibt es einen besseren Ansatz:

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) 

macht sie es datetime dtype konvertieren:

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 

Filterung 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 

Filterung .query() Methode:

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: wenn Sie original Date in String dtype erhalten wollen:

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) 

erste fügen Sie eine neue datetime Spalte:

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 

Filterung:

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

ok, ich denke, die beste Idee ist, das Datum in datetime zu konvertieren, aber einige Werte für dieses Schicksal sind None oder NA, und ich muss diese Werte auch zeigen. Jede Option, um es zu tun, weil ich denke, datetime akzeptiert keine Zeichenfolgen. Der Code ist so etwas –

+0

Ich mache ein Update auf den ursprünglichen Beitrag –

+0

@CarlosArronteBello, möchten Sie die Zeilen haben, wo 'Date' ist' None' oder 'NaN' im resultierenden Datensatz (nach dem Filtern)? – MaxU

Verwandte Themen