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
使用包含
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
.