在Pandas中删除具有“空”值超过60%的列

Kry*_*ypt 4 python pandas

我有一个这样的数据框:

import pandas as pd
data = {
    'c1': ['Test1','Test2','NULL','Test3',' ','Test4','Test4','Test1',"Test3"],
    'c2': [' ','Test1',' ','NULL',' ','NULL','NULL','NULL','NULL'],
    'c3': [0,0,0,0,0,1,5,0,0],
    'c4': ['NULL', 'Test2', 'Test1','Test1', 'Test2', 'Test2','Test1','Test1','Test2']
}
df = pd.DataFrame(data)
df
Run Code Online (Sandbox Code Playgroud)

数据框如下所示:

    c1      c2      c3      c4
0   Test1           0       NULL
1   Test2   Test1   0       Test2
2   NULL            0       Test1
3   Test3   NULL    0       Test1
4                   0       Test2
5   Test4   NULL    1       Test2
6   Test4   NULL    5       Test1
7   Test1   NULL    0       Test1
8   Test3   NULL    0       Test2
Run Code Online (Sandbox Code Playgroud)

我想删除所有具有超过“空”值60%的列。在我的情况下,“ Empty”表示值例如:“','NULL”或0。有字符串(c1,c2,c4)和整数(c3)。

结果应该是仅包含列c1和c4的数据框。

    c1      c4
0   Test1   NULL
1   Test2   Test2
2   NULL    Test1
3   Test3   Test1
4           Test2
5   Test4   Test2
6   Test4   Test1
7   Test1   Test1
8   Test3   Test2
Run Code Online (Sandbox Code Playgroud)

我不知道如何处理这个问题。我唯一想到的是

df.loc[:, (df != 0).any(axis=0)]
Run Code Online (Sandbox Code Playgroud)

删除所有值均为0,'NULL'等的所有列。

jez*_*ael 5

使用DataFrame.isin用于检查所有的格式,然后获得mean由treshold和过滤boolean indexingloc

print (df.isin([' ','NULL',0]))
      c1     c2     c3     c4
0  False   True   True   True
1  False  False   True  False
2   True   True   True  False
3  False   True   True  False
4   True   True   True  False
5  False   True  False  False
6  False   True  False  False
7  False   True   True  False
8  False   True   True  False

print (df.isin([' ','NULL',0]).mean())
c1    0.222222
c2    0.888889
c3    0.777778
c4    0.111111
dtype: float64

df = df.loc[:, df.isin([' ','NULL',0]).mean() < .6]
print (df)
      c1     c4
0  Test1   NULL
1  Test2  Test2
2   NULL  Test1
3  Test3  Test1
4         Test2
5  Test4  Test2
6  Test4  Test1
7  Test1  Test1
8  Test3  Test2
Run Code Online (Sandbox Code Playgroud)

  • @Krypt - 请检查`df = df.loc[:, (df.isin([' ','NULL',0]) | df.isnull()).mean() &lt;= .6]` (3认同)

shi*_*vsn 5

您可以使用dropna thresh参数删除列:

In [58]: df = df.replace([0,' ','NULL'],np.nan)
In[59]: df
Out[59]: 
      c1     c2   c3     c4
0  Test1    NaN  NaN    NaN
1  Test2  Test1  NaN  Test2
2    NaN    NaN  NaN  Test1
3  Test3    NaN  NaN  Test1
4    NaN    NaN  NaN  Test2
5  Test4    NaN  1.0  Test2
6  Test4    NaN  5.0  Test1
7  Test1    NaN  NaN  Test1
8  Test3    NaN  NaN  Test2

In [60]: df.dropna(thresh=df.shape[0]*0.6,how='all',axis=1)
Out[60]: 
      c1     c4
0  Test1    NaN
1  Test2  Test2
2    NaN  Test1
3  Test3  Test1
4    NaN  Test2
5  Test4  Test2
6  Test4  Test1
7  Test1  Test1
8  Test3  Test2
Run Code Online (Sandbox Code Playgroud)