根据值删除 Pandas 中的 DataFrame 列

Pra*_*amy 3 python pandas

我有一个像这样的数据框:

    Col0    Col1    Col2    Col3
1   a       b       g       a
2   a       d       z       a
3   a       g       x       a
4   a       h       p       a
5   a       b       c       a
Run Code Online (Sandbox Code Playgroud)

我需要删除值为“a”的列。没有其他单元格包含值“a”(例如,此处 Col1 和 Col2 将没有值为“a”的单元格)。我有大约 1000 列,我不确定所有列的值都为“a”。所需的数据框应该是这样的。,

    Col1    Col2
1   b       g   
2   d       z    
3   g       x    
4   h       p    
5   b       c    
Run Code Online (Sandbox Code Playgroud)

做到这一点的最佳方法是什么?

jez*_*ael 5

使用anyif 需要检查是否至少有一个Trueall如果需要检查所有Truesboolean indexingloc,因为过滤列:

print (df)
  Col0 Col1 Col2 Col3
0    a    a    g    a
1    a    d    z    a
2    a    g    x    a
3    a    h    p    a
4    a    b    c    a


df2 = df.loc[:, ~(df == 'a').any()]
print (df2)
  Col2
0    g
1    z
2    x
3    p
4    c

df1 = df.loc[:, ~(df == 'a').all()]
print (df1)
  Col1 Col2
0    a    g
1    d    z
2    g    x
3    h    p
4    b    c
Run Code Online (Sandbox Code Playgroud)

细节:

print (df == 'a')

   Col0   Col1   Col2  Col3
0  True   True  False  True
1  True  False  False  True
2  True  False  False  True
3  True  False  False  True
4  True  False  False  True
Run Code Online (Sandbox Code Playgroud)
df2 = df.loc[:, (df != 'a').any()]
print (df2)
  Col1 Col2
0    a    g
1    d    z
2    g    x
3    h    p
4    b    c

df1 = df.loc[:, (df != 'a').all()]
print (df1)
  Col2
0    g
1    z
2    x
3    p
4    c

print (df != 'a')

    Col0   Col1  Col2   Col3
0  False  False  True  False
1  False   True  True  False
2  False   True  True  False
3  False   True  True  False
4  False   True  True  False
Run Code Online (Sandbox Code Playgroud)

编辑:

对于检查混合类型 - 带字符串的数字是 2 种可能的解决方案,将全部转换为strings 或比较 numpy 数组:

df.astype(str) == 'a'
Run Code Online (Sandbox Code Playgroud)

或者:

df.values == 'a'
Run Code Online (Sandbox Code Playgroud)