2015-03-25 62 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]