Python 熊猫在数据框中搜索日期格式和非日期格式
以下是我的设想: 我需要寻找。让我们说以下三个术语:“苹果”、“糖果”和“时间” 我还需要搜索“MM/dd/yyyy”中的任何值 我需要搜索整个数据框列,列“A”,以查找所有这4项内容 假设我有一个数据帧,看起来像这样: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
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,您可以在花括号内执行语句,结果显示在字符串中。但是,由于正则表达式也使用花括号,因此我需要将它们包装在另一个花括号中,以使正则表达式工作。