2015-03-25 99 views
6

我是熊貓新手,我試圖在Dataframe中加載csv。我的數據缺少代表的值? ,我試圖用標準的Missing值替換它 - NaN熊貓如何更換?與NaN - 處理非標準缺失值

請幫助我解決這個問題。我嘗試閱讀熊貓文檔,但我無法遵循。

def readData(filename): 
    DataLabels =["age", "workclass", "fnlwgt", "education", "education-num", "marital-status", 
       "occupation", "relationship", "race", "sex", "capital-gain", 
       "capital-loss", "hours-per-week", "native-country", "class"] 

    # ==== trying to replace ? with Nan using na_values 
    rawfile = pd.read_csv(filename, header=None, names=DataLabels, na_values=["?"]) 
    age = rawfile["age"] 
    print age 
    print rawfile[25:40] 

    #========trying to replace ? 
    rawfile.replace("?", "NaN") 
    print rawfile[25:40] 

The Snap shot of the data

+1

不過令人驚訝的是參數'read_csv'沒有工作。當價值實際上是'我有一個看似失敗'? '我只是在標記'?'作爲NaN。 – cphlewis 2015-03-25 06:27:00

+0

你在那個專欄或其他地方有'?'嗎? – EdChum 2015-03-25 08:49:28

+0

奇怪的是,'read_csv'沒有選擇這個值,你可以發佈原始輸入數據來重現你的錯誤,它可能不僅僅是單個字符在該列 – EdChum 2015-03-25 08:51:09

回答

21

您可以替換這只是˚F或者該列使用replace

df['workclass'].replace('?', np.NaN) 

或整個DF:

df.replace('?', np.NaN) 

UPDATE

好吧,我想通了您的問題,在默認情況下,如果你不通過一個分離器字符然後read_csv將使用逗號','作爲分隔符。

你的數據,特別是一個例子,你有一個問題的行:

54, ?, 180211, Some-college, 10, Married-civ-spouse, ?, Husband, Asian-Pac-Islander, Male, 0, 0, 60, South, >50K 

實際上已經一個逗號和作爲分隔空間,所以當你通過了na_value=['?']這並沒有匹配,因爲所有的價值觀在他們面前有一個你無法觀察的空間。

如果你改變你的線這個

rawfile = pd.read_csv(filename, header=None, names=DataLabels, sep=',\s', na_values=["?"]) 

那麼你會發現,所有的工作:

27  54    NaN 180211 Some-college    10 
1

使用numpy.nan

Numpy - Replace a number with NaN

import numpy as np 
df.applymap(lambda x: np.nan if x == '?' else x) 
+0

感謝你Liam的快速回復,我也會試試這個。 – 2015-03-25 05:11:32

1

好吧,我通過了它:

#========trying to replace ? 
    newraw= rawfile.replace('[?]', np.nan, regex=True) 
    print newraw[25:40]