2017-06-13 28 views
2

我正在處理大型數據集(> 100.000,> 100)。原始格式是CSV。我使用pandas庫將這些文件作爲DataFrame讀取。找到數據框python中的錯誤數據點

所有數據都必須是數值類型(浮點數的整數),但通常會出現數據點丟失或原始CSV文件中出現錯誤的字符串。掃描整個CSV文件需要很長時間,可以找到一點。因此,我試圖產生一個功能或類,我可以找到錯誤。並提供他們的列和行名稱和/或編號,以便快速追蹤它們。

爲了試驗和構建正確的算法,我使用了一個小的虛擬數據框,其中包含一些樣本錯誤的數據點。定位點的理想結果是例如:['B',2],['D',4],使用列和位置索引。

# Import dependency 
import pandas as pd 

# Create dummy DataFrame for testing 
df = pd.DataFrame({'A': [1, 1, 1, 1, 1], 
        'B': [1, 1, '#', 1, 1], # Undesired datapoint '#' to be located 
        'C': [1, 1, 1, 1, 1], 
        'D': [1, 1, 1, 1, '0']}) # Undesired datapoint '0' to be located 

`

隨着虛擬數據框我創建包含原始數據幀的布爾語句的面具數據幀。在掩碼中,所有數值(intfloat)都被賦予True,並且所有非數值數據被賦予爲False

df_mask = df.applymap(lambda x: isinstance(x, (int, float))) 

現在,在定位非數值數據的部分,我卡住了。我最好的嘗試如下,但它不提供我的位置False點。

df_cols = col for col if df_mask.loc[False].any() 

什麼是搶蒙面數據框(df_mask)的False位置的方法嗎?

或者是否有更快的方法來執行跟蹤DataFrame中的錯誤數據點?

回答

2

我想你可以通過unstack創建Series第一,然後通過boolean indexing創建maskapply和最後一個過濾器。

對於指數的值是必要的附加remove_unused_levels

df = df.unstack() 
df_mask = df.apply(lambda x: isinstance(x, (int, float))) 

print (df[~df_mask]) 
B 2 # 
D 4 0 
dtype: object 

print (df.index[~df_mask].remove_unused_levels().tolist()) 
[('B', 2), ('D', 4)] 

編輯:

如果要提取的非數字值,則使用to_numericerrors='coerce'的值轉化爲NaN秒,然後檢查他們:

df = pd.DataFrame({'A': [1, 1, 1, 1, 1], 
        'B': [1, 1, '#', 1, 1], 
        'C': [1, 1, 1, 1, 1], 
        'D': [1, 1, 1, 1, '0']}).astype(str) 

print (df.applymap(type)) 
       A    B    C    D 
0 <class 'str'> <class 'str'> <class 'str'> <class 'str'> 
1 <class 'str'> <class 'str'> <class 'str'> <class 'str'> 
2 <class 'str'> <class 'str'> <class 'str'> <class 'str'> 
3 <class 'str'> <class 'str'> <class 'str'> <class 'str'> 
4 <class 'str'> <class 'str'> <class 'str'> <class 'str'> 

df = df.unstack() 
df_mask = pd.to_numeric(df, errors='coerce').isnull() 
print (df[df_mask]) 
B 2 # 
dtype: object 

print (df.index[df_mask].remove_unused_levels().tolist()) 
[('B', 2)] 
+0

非常感謝jezrael,真的有幫助! (對不起,對於最近的回覆。)但是,只有當我在問題中設置了一個虛擬數據框時才起作用。當我使用'pd.read_csv'作爲數據框從CSV導入相同的數據,然後使用unstack()並應用掩碼時,它會爲整行中具有非數字值的整列中的所有值返回False。你知道是什麼導致了差異? – HelloBlob

+0

@HelloBlob - 請檢查編輯答案。 – jezrael