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

Python 熊猫在数据框中搜索日期格式和非日期格式,python,python-3.x,pandas,Python,Python 3.x,Pandas,以下是我的设想: 我需要寻找。让我们说以下三个术语:“苹果”、“糖果”和“时间” 我还需要搜索“MM/dd/yyyy”中的任何值 我需要搜索整个数据框列,列“A”,以查找所有这4项内容 假设我有一个数据帧,看起来像这样: df4 A Q R S 0 Apple chair red english 1 orange desk b

以下是我的设想:

我需要寻找。让我们说以下三个术语:“苹果”、“糖果”和“时间”

我还需要搜索“MM/dd/yyyy”中的任何值

我需要搜索整个数据框列,列“A”,以查找所有这4项内容

假设我有一个数据帧,看起来像这样:

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
搜索实际单词没有问题。我不知道如何同时搜索单词和日期格式

有人有什么建议吗?

IIUC,使用和

IIUC、使用和维护

您可以使用:

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='concurve'))
返回
NaT
,如果它不是datetime格式,那么您可以获得所有的
notnull
,这将匹配日期时间。然后,使用
操作符,另外查找
apple
candy
time

您可以使用:

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='concurve'))
返回
NaT
,如果它不是datetime格式,那么您可以获得所有的
notnull
,这将匹配日期时间。然后,使用
|
操作符,另外查找
apple
candy
time

检查这里的多个条件将在整个colu中迭代mn两次,这可能会很昂贵(特别是使用
pandas
'已经很慢的字符串操作)。单个正则表达式可以轻松完成此任务:

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

如果您没有使用Python 3.6+,那么同样的想法可以用
格式表达:

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

检查此处的多个条件将在整个列中迭代两次,这可能会带来昂贵的成本(尤其是使用已经很慢的字符串操作)。单个正则表达式可以轻松完成此任务:

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

如果您没有使用Python 3.6+,那么同样的想法可以用
格式表达:

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

你最初是怎么得到这个DF的?它看起来像是一个糟糕的连接或其他什么的结果。我接受了100多个sql查询,将它们作为一个巨大的数据帧列导入。这些数据不是sql查询,但想法是一样的。
DF.loc[DF.a.str.contains(r'(?I)(apple | candy | time | \d{2}\/\d{2}/\d{4})]
你最初是如何得到这个DF的?它看起来像是一个糟糕的连接或其他什么的结果。我接受了100多个sql查询,将它们作为一个巨大的数据帧列导入。这些数据不是sql查询,但想法是一样的。
DF.loc[DF.a.str.contains(r'(?I)(apple | candy | time |\d{2}\/\d{2}/\d{4})]
Testing this now Testing this now“fr”是做什么的?为什么不使用r?我以前也从未见过在这种情况下使用大括号,这是最好的解决方案,我只见过它用于“digits{3,6}”之类的东西,在这种情况下它们是如何工作的?我在这里使用python f-strings,您可以在花括号内执行语句,结果显示在字符串中。但是,由于正则表达式也使用花括号,我需要将它们包装在一个额外的花括号中以使正则表达式工作。“fr”是什么意思do?为什么不使用r?我以前也从未见过大括号在这个上下文中使用,它是最高级的解决方案,我只见过它用于“digits{3,6}”之类的东西,在这种情况下它们是如何工作的?我在这里使用python f-strings,您可以在花括号内执行语句,结果显示在字符串中。但是,由于正则表达式也使用花括号,因此我需要将它们包装在另一个花括号中,以使正则表达式工作。