清理大熊猫中的数据

时间:2016-10-10 18:12:04

标签: python pandas

我有以下数据框:

    Datum   Unternehmen     Event
0   9 Termine vom 01.01.2016 bis zum 31.12.2017     9 Termine vom 01.01.2016 bis zum 31.12.2017     NaN
1   9 Termine vom 01.01.2016 bis zum 31.12.2017     NaN     NaN
2   Datum   Unternehmen     Event
3   12.05.2017  ADIDAS AG   Dividenden
4   09.11.2017  ADIDAS AG   Ergebnisberichte
5   03.08.2017  ADIDAS AG   Ergebnisberichte
6   11.05.2017  ADIDAS AG   Hauptversammlung
7   04.05.2016  ADIDAS AG   Ergebnisberichte
8   03.03.2016  ADIDAS AG   Ergebnisberichte
9   04.08.2016  ADIDAS AG   Ergebnisberichte
10  03.11.2016  ADIDAS AG   Ergebnisberichte
11  12.05.2016  ADIDAS AG   Hauptversammlung

我想保留行(!)只有明显的日期。

目前,我正在使用df.iterrows()进行迭代并使用正则表达式(r'^[\d.]+$')检查值,但我想知道是否有更多" pythonic方式"当应用于几百个数据帧时,iterrows()非常慢。

1 个答案:

答案 0 :(得分:1)

我认为您可以将to_datetime与参数errors='coerce'一起使用,并使用boolean indexing检查NaN的位置:

print (pd.to_datetime(df.Datum, errors='coerce'))
0           NaT
1           NaT
2           NaT
3    2017-12-05
4    2017-09-11
5    2017-03-08
6    2017-11-05
7    2016-04-05
8    2016-03-03
9    2016-04-08
10   2016-03-11
11   2016-12-05
Name: Datum, dtype: datetime64[ns]

print (pd.to_datetime(df.Datum, errors='coerce').notnull())
0     False
1     False
2     False
3      True
4      True
5      True
6      True
7      True
8      True
9      True
10     True
11     True
Name: Datum, dtype: bool
print (df[pd.to_datetime(df.Datum, errors='coerce').notnull()])
         Datum Unternehmen             Event
3   12.05.2017   ADIDAS AG        Dividenden
4   09.11.2017   ADIDAS AG  Ergebnisberichte
5   03.08.2017   ADIDAS AG  Ergebnisberichte
6   11.05.2017   ADIDAS AG  Hauptversammlung
7   04.05.2016   ADIDAS AG  Ergebnisberichte
8   03.03.2016   ADIDAS AG  Ergebnisberichte
9   04.08.2016   ADIDAS AG  Ergebnisberichte
10  03.11.2016   ADIDAS AG  Ergebnisberichte
11  12.05.2016   ADIDAS AG  Hauptversammlung

如果需要将列Datum转换为datetime

df.Datum = pd.to_datetime(df.Datum, errors='coerce')

print (df.Datum.notnull())
0     False
1     False
2     False
3      True
4      True
5      True
6      True
7      True
8      True
9      True
10     True
11     True
Name: Datum, dtype: bool

print (df[df.Datum.notnull()])
        Datum Unternehmen             Event
3  2017-12-05   ADIDAS AG        Dividenden
4  2017-09-11   ADIDAS AG  Ergebnisberichte
5  2017-03-08   ADIDAS AG  Ergebnisberichte
6  2017-11-05   ADIDAS AG  Hauptversammlung
7  2016-04-05   ADIDAS AG  Ergebnisberichte
8  2016-03-03   ADIDAS AG  Ergebnisberichte
9  2016-04-08   ADIDAS AG  Ergebnisberichte
10 2016-03-11   ADIDAS AG  Ergebnisberichte
11 2016-12-05   ADIDAS AG  Hauptversammlung`