如何排除和过滤pandas中的几列?

Pou*_*del 4 python dataframe pandas

我知道我们可以使用 pandas dataframe 过滤器仅选择几列,但是我们也可以仅排除某些列吗?

这是 MWE:

import numpy as np
import pandas as pd


df = pd.DataFrame({'id': [1,2,3], 'num_1': [10,20,30], 'num_2': [20,30,40]})

df.filter(regex='num')
Run Code Online (Sandbox Code Playgroud)

我们可以选择列中没有“num”的所有列吗:

就像是:

df.filter(regex='^(num)')
Run Code Online (Sandbox Code Playgroud)

所需输出

   id
0   1
1   2
2   3
Run Code Online (Sandbox Code Playgroud)

笔记

# these already works, i am only looking regex way
df[['id']] # gives the required output

Run Code Online (Sandbox Code Playgroud)

参考:
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.filter.html

Pou*_*del 5

使用包含

df.loc[:,~df.columns.str.contains('num')]
df.loc[:,~df.columns.str.startswith('num')]
Run Code Online (Sandbox Code Playgroud)

利用差异

df.loc[:,~df.columns.str.contains('num')]
df.loc[:,~df.columns.str.startswith('num')]
Run Code Online (Sandbox Code Playgroud)

使用掉落

df[df.columns.difference(['num_1','num_2'])]
df[df.columns.difference([i for i in df.columns if i.startswith('num'])]
df[df.columns.difference([i for i in df.columns if 'num' in i]
Run Code Online (Sandbox Code Playgroud)

感谢@ALollz
如果你坚持使用filter

df.filter(regex='^((?!num).)*$')
Run Code Online (Sandbox Code Playgroud)

但这不仅丑陋且难以阅读/理解,而且还容易受到正则表达式搜索的一些陷阱的影响,如正则表达式匹配不包含单词的行中所述。

我建议坚持使用contains.