Pandas 使用多个类似条件过滤列名

par*_*ist 0 python filter pandas

我想使用 pandas 数据帧过滤器的简单性,但使用多个LIKE标准。我的数据框中有很多列,我想将列标题组织到不同的列表中。

例如 - 任何包含“时间”的列标题。

df.filter(like='time',axis=1)``
Run Code Online (Sandbox Code Playgroud)

然后是包含“分钟”或“秒”的任何列。但我如何在这个简单、干净的声明中允许多个标准呢?我已经尝试了很多类似的迭代,有没有办法做到这一点,或者这个声明不允许这样做?如果没有,欢迎使用其他简单、干净的方法!

df.filter(like=('mins','secs'),axis=1)
Run Code Online (Sandbox Code Playgroud)

ALo*_*llz 5

不要使用like. like用于保留 的标签like in label == True

相反,您需要DataFrame.filter regex类型过滤,将子字符串与|

import pandas as pd
df = pd.DataFrame(data=1, columns=['foo', 'bar', 'foobar', 'bazz'], index=[0])

df.filter(regex='foo|bar')
#   foo  bar  foobar
#0    1    1       1
Run Code Online (Sandbox Code Playgroud)

如果您希望过滤“不像”,我发现使用列表理解来查找要保留的标签更容易。在这里,我们排除任何包含或的'foo'标签'bar'

cols = [label for label in df.columns if not any(x in label for x in ['foo', 'bar'])]

df[cols]
#   bazz
#0     1
Run Code Online (Sandbox Code Playgroud)

  • 对于逆,我也会考虑“df.loc[:,~df.columns.str.contains('foo|bar')]”,但是是的,我同意 - 当不需要时,不要使用正则表达式:) (3认同)