簡體   English   中英

刪除 Pandas 中“空”值超過 60% 的列

[英]Drop Columns with more than 60 Percent of "empty" Values in Pandas

我有這樣的 dataframe:

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

dataframe 看起來像這樣:

    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)。

結果應為 dataframe,僅包含 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' 等的所有列。

使用DataFrame.isin檢查所有格式,然后獲取閾值和過濾器的mean通過boolean indexing使用loc

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

你可以使用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

下面給出的解決方案非常小而且速度很快(在性能上)

步驟:1 我們在每一列中找到 null 值的百分比

步驟:2 我們在列表中找到超過 60% null 值的列名

步驟:3 刪除值超過 60% null 的列

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)

# Below code gives percentage of null in every column
null_percentage = df.isnull().sum()/df.shape[0]*100

# Below code gives list of columns having more than 60% null
col_to_drop = null_percentage[null_percentage>60].keys()

output_df = df.drop(col_to_drop, axis=1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM