如何基于列名、类型和统计信息(如Python中的std)删除2列或更多列?

2024-04-20 01:06:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图删除所有包含k1和p5的列,并有一个没有这些列的新数据帧,但我得到了一个错误。你知道吗

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

此外,我正在对我的数据帧执行另外两个过滤器。第一个是删除包含“objects”的列,第二个是删除std=0的列。你知道吗


Tags: columns数据dfnewobjects错误k1all
1条回答
网友
1楼 · 发布于 2024-04-20 01:06:42

您可以使用:

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,但它会删除所有非数字列,因此通过^{}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

相关问题 更多 >