熊猫在数据框中搜索日期格式和非日期格式

时间:2018-08-23 19:51:28

标签: python python-3.x pandas

这是我的情况:

我需要搜索。 。 。假设以下3个术语:“苹果”,“糖果”和“时间”。

我还需要搜索“ MM / dd / yyyy”中的所有值。

我需要在整个数据框列中搜索列“ A”,以查找所有这四种情况。

假设我有一个看起来像这样的数据框:

df4

            A           Q           R           S
0       Apple       chair         red     english
1      orange        desk        blue      german
2        pear     monitor      yellow     spanish
3       Apple       chair      purple     english
4  10/01/2016  05/02/2004  05/05/2014  06/20/2018
5  02/20/2017  01/01/2017  07/07/2017  02/04/2004

我期望的输出是这样:

            A           Q           R           S
0       Apple       chair         red     english
3       Apple       chair      purple     english
4  10/01/2016  05/02/2004  05/05/2014  06/20/2018
5  02/20/2017  01/01/2017  07/07/2017  02/04/2004

搜索实际单词没有问题。我不知道该如何同时搜索单词和日期格式。

有人有什么建议吗?

3 个答案:

答案 0 :(得分:2)

IIUC,使用str.containsstr.match

vals = ['apple', 'candy', 'time']
df.loc[df.A.str.contains('|'.join(vals), case=False) | df.A.str.match(r'(\d+/\d+/\d+)')]

    A           Q           R           S
0   Apple       chair       red         english
3   Apple       chair       purple      english
4   10/01/2016  05/02/2004  05/05/2014  06/20/2018
5   02/20/2017  01/01/2017  07/07/2017  02/04/2004

答案 1 :(得分:2)

在这里检查多个条件将遍历整个列两次,这可能会变得很昂贵(尤其是使用pandas'已经很慢的字符串操作)。单个正则表达式可以轻松完成此任务:

keys = ['apple', 'candy', 'time']
rgx = fr"(?i){'|'.join(keys)}|\d{{2}}/\d{{2}}/\d{{4}}"

df.loc[df.A.str.contains(rgx)]

            A           Q           R           S
0       Apple       chair         red     english
3       Apple       chair      purple     english
4  10/01/2016  05/02/2004  05/05/2014  06/20/2018
5  02/20/2017  01/01/2017  07/07/2017  02/04/2004

如果您不使用Python 3.6+,则可以使用format表达相同的想法:

rgx = r"(?i){}|\d{{2}}/\d{{2}}/\d{{4}}".format('|'.join(keys))

答案 2 :(得分:1)

您可以使用:

df[(pd.to_datetime(df.A, errors='coerce').notnull()) | (df.A.str.lower().isin(['apple', 'candy', 'time']))]

            A           Q           R           S
0       Apple       chair         red     english
3       Apple       chair      purple     english
4  10/01/2016  05/02/2004  05/05/2014  06/20/2018
5  02/20/2017  01/01/2017  07/07/2017  02/04/2004

作为有关搜索日期时间的快速说明,如果(pd.to_datetime(df.A, errors='coerce')不是日期时间格式,则返回NaT,因此您可以获取所有notnull,并且它将与日期时间匹配。然后,使用|运算符,并另外查找applecandytime