我有一个这样的数据框:
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
数据框如下所示:
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
我想删除所有列,其中有超过60%的"空"值。 "空"在我的情况下,这些值是指例如:' ',' 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
我不知道如何处理这个问题。我想到的只有像
这样的东西df.loc[:, (df != 0).any(axis=0)]
删除所有值为0的所有列,' NULL'等等。
答案 0 :(得分:4)
使用DataFrame.isin
检查所有格式,然后获取mean
以获取阈值,并使用loc
按boolean indexing
进行过滤:
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
答案 1 :(得分:4)
您可以使用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