如何根据列名、类型和统计信息(例如 Python 中的 std)删除 2 个或更多列?
How to drop 2 or more columns based on column name, type and statistics such as std in Python?
我试图删除所有包含 k1 和 p5 的列,并创建一个没有这些列的新 DataFrame,但出现错误。
df_r1 = df.filter(regex=("k1\s")) #filter all k1 columns
df_r2 = df.filter(regex=("p5\s")) #filter all p5 columns
df_dropped_new = df.drop((df_r1,df_r2),axis = 1)
上面一行让我得到以下错误
DataFrame' objects are mutable, thus they cannot be hashed
此外,我正在对我的数据帧执行另外 2 个过滤器。第一个是删除包含 "objects" 的列,第二个是删除包含 std=0.
的列
您可以使用:
df = pd.DataFrame({'A':list('abcdef'),
'p5 sd':[4,5,4,5,5,4],
'C':[7,8,9,4,2,3],
'k1 s':[1,3,5,7,1,0],
'V':[5,5,5,5,5,5],
'k1 d':list('aaabbb')})
print (df)
A C V k1 d k1 s p5 sd
0 a 7 5 a 1 4
1 b 8 5 a 3 5
2 c 9 5 a 5 4
3 d 4 5 b 7 5
4 e 2 5 b 1 5
5 f 3 5 b 0 4
首先检查 std
是否为 0
,但它会删除所有非数字列,因此通过 reindex
和 fill_value=True
:
添加它们
m1 = df.std().eq(0).reindex(df.columns, fill_value=True)
然后检查是否包含列名称模式:
m2 = m1.index.str.contains("p5\s|k1\s")
print (m1)
A True
C False
V True
k1 d True
k1 s False
p5 sd False
dtype: bool
print (m2)
[False False False True True True]
通过 or
(|
):
将两个掩码链接在一起
m = m1 | m2
print (m)
A True
C False
V True
k1 d True
k1 s True
p5 sd True
dtype: bool
最后一个过滤器,但需要通过 ~
:
反转掩码
df = df.loc[:, ~m]
print (df)
C
0 7
1 8
2 9
3 4
4 2
5 3
编辑:
Mask
对于删除非数字列是没有必要的,因为 std
自动删除非数字列:
m0 = df.columns.isin(df.select_dtypes(include=['object']))
m1 = df.std().eq(0).reindex(df.columns, fill_value=True)
m2 = m1.index.str.contains("p5\s|k1\s")
m = m1 | m2 | m0
print (m)
A True
C False
V True
k1 d True
k1 s True
p5 sd True
dtype: bool
df = df.loc[:, ~m]
print (df)
C
0 7
1 8
2 9
3 4
4 2
5 3
我试图删除所有包含 k1 和 p5 的列,并创建一个没有这些列的新 DataFrame,但出现错误。
df_r1 = df.filter(regex=("k1\s")) #filter all k1 columns
df_r2 = df.filter(regex=("p5\s")) #filter all p5 columns
df_dropped_new = df.drop((df_r1,df_r2),axis = 1)
上面一行让我得到以下错误
DataFrame' objects are mutable, thus they cannot be hashed
此外,我正在对我的数据帧执行另外 2 个过滤器。第一个是删除包含 "objects" 的列,第二个是删除包含 std=0.
的列您可以使用:
df = pd.DataFrame({'A':list('abcdef'),
'p5 sd':[4,5,4,5,5,4],
'C':[7,8,9,4,2,3],
'k1 s':[1,3,5,7,1,0],
'V':[5,5,5,5,5,5],
'k1 d':list('aaabbb')})
print (df)
A C V k1 d k1 s p5 sd
0 a 7 5 a 1 4
1 b 8 5 a 3 5
2 c 9 5 a 5 4
3 d 4 5 b 7 5
4 e 2 5 b 1 5
5 f 3 5 b 0 4
首先检查 std
是否为 0
,但它会删除所有非数字列,因此通过 reindex
和 fill_value=True
:
m1 = df.std().eq(0).reindex(df.columns, fill_value=True)
然后检查是否包含列名称模式:
m2 = m1.index.str.contains("p5\s|k1\s")
print (m1)
A True
C False
V True
k1 d True
k1 s False
p5 sd False
dtype: bool
print (m2)
[False False False True True True]
通过 or
(|
):
m = m1 | m2
print (m)
A True
C False
V True
k1 d True
k1 s True
p5 sd True
dtype: bool
最后一个过滤器,但需要通过 ~
:
df = df.loc[:, ~m]
print (df)
C
0 7
1 8
2 9
3 4
4 2
5 3
编辑:
Mask
对于删除非数字列是没有必要的,因为 std
自动删除非数字列:
m0 = df.columns.isin(df.select_dtypes(include=['object']))
m1 = df.std().eq(0).reindex(df.columns, fill_value=True)
m2 = m1.index.str.contains("p5\s|k1\s")
m = m1 | m2 | m0
print (m)
A True
C False
V True
k1 d True
k1 s True
p5 sd True
dtype: bool
df = df.loc[:, ~m]
print (df)
C
0 7
1 8
2 9
3 4
4 2
5 3