2017-09-23 37 views
1

我有一個非常寬的數據框> 10,000列,我需要計算每個中的空值的百分比。現在我正在做:更有效的方式來迭代和計算列數

threshold=0.9 
for c in df_a.columns[:]: 
    if df_a[df_a[c].isNull()].count() >= (df_a.count()*threshold): 
     # print(c) 
     df_a=df_a.drop(c) 

當然這是一個緩慢的過程,偶爾崩潰。有沒有更有效的方法我失蹤?

謝謝!

回答

0

根據數據幀的大小,您可以採取的策略很少。代碼看起來不錯。您需要瀏覽每列並計算空值的數量。

一種策略是緩存輸入數據幀。這將啓用更快的過濾。如果數據幀不是很大

而且

df_a=df_a.drop(c) 

我這個有點懷疑,因爲這是改變循環數據幀然而,這工作。更好地保留空列名稱並稍後在單獨的循環中從數據框中刪除。

如果數據幀很大並且無法完全緩存,則可以將數據幀劃分到一些有限的可管理列中。就像每次取100列並緩存那個較小的數據幀並在循環中運行分析100次。

現在,您可能想要跟蹤分析的列列表,與此例中尚未分析的列分開。這樣,即使作業失敗,您也可以從其餘列開始分析。

1

你應該避免使用pyspark進行迭代,因爲它不再分配計算。 在列上使用count將計算非null元素的count

threshold = 0.9 
import pyspark.sql.functions as psf 
count_df = df_a\ 
    .agg(*[psf.count("*").alias("count")]+ [psf.count(c).alias(c) for c in df_a.columns])\ 
    .toPandas().transpose() 

第一個元素是行中數據幀的數量:

total_count = count_df.iloc[0, 0] 
kept_cols = count_df[count_df[0] > (1 - threshold)*total_count].iloc[1:,:] 
df_a.select(list(kept_cols.index)) 
相關問題