Pandas文本匹配像SQL的LIKE?

nau*_*101 25 string-matching pandas sql-like

有没有办法在pandas文本DataFrame列上执行与SQL的LIKE语法类似的操作,以便返回索引列表或可用于索引数据帧的布尔值列表?例如,我希望能够匹配列以"prefix_"开头的所有行,类似于WHERE <col> LIKE prefix_%SQL.

And*_*den 26

您可以使用Series方法str.startswith(采用正则表达式):

In [11]: s = pd.Series(['aa', 'ab', 'ca', np.nan])

In [12]: s.str.startswith('a', na=False)
Out[12]: 
0     True
1     True
2    False
3    False
dtype: bool
Run Code Online (Sandbox Code Playgroud)

您也可以使用str.contains(使用正则表达式):

In [13]: s.str.contains('^a', na=False)
Out[13]: 
0     True
1     True
2    False
3    False
dtype: bool
Run Code Online (Sandbox Code Playgroud)

所以你可以df[col].str.startswith......

另请参阅文档的SQL比较部分.

注意:(正如OP所指出的)默认情况下,NaN会传播(因此如果你想将结果用作布尔掩码,会导致索引错误),我们使用这个标志来说NaN应该映射到False.

In [14]: s.str.startswith('a')  # can't use as boolean mask
Out[14]:
0     True
1     True
2    False
3      NaN
dtype: object
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你,安迪。我也值得注意的是,在索引编制时使用nan会导致错误,因为它们默认返回nan。您可以使用s.str.startswith('a',na = False)`强制它们返回False。 (2认同)

小智 9

  1. 要从以模式“s”开头的系列中查找所有值:

SQL - WHERE column_name LIKE 's%'
Python - column_name.str.startswith('s')

  1. 要从以模式“s”结尾的系列中查找所有值:

SQL - WHERE column_name LIKE '%s'
Python - column_name.str.endswith('s')

  1. 要从包含模式“s”的系列中查找所有值:

SQL - WHERE column_name LIKE '%s%'
Python - column_name.str.contains('s')

有关更多选项,请检查:https : //pandas.pydata.org/pandas-docs/stable/reference/series.html


sus*_*mit 7

您可以使用

s.str.contains('a', case = False)
Run Code Online (Sandbox Code Playgroud)