这是我的情况:
我需要搜索。 。 。假设以下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
搜索实际单词没有问题。我不知道该如何同时搜索单词和日期格式。
有人有什么建议吗?
答案 0 :(得分:2)
IIUC,使用str.contains
和str.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
,并且它将与日期时间匹配。然后,使用|
运算符,并另外查找apple
,candy
和time
。