Python 如何用NaN替换熊猫中的值?

Python 如何用NaN替换熊猫中的值?,python,pandas,Python,Pandas,我是熊猫的新手,我正在尝试在数据帧中加载csv。我的数据缺少表示为?的值,我试图用标准缺失值替换它-NaN 请帮我做这个。我试着通读熊猫的文档,但我不能理解 def readData(文件名): 数据标签=[“年龄”、“工人阶级”、“fnlwgt”、“受教育程度”、“受教育人数”、“婚姻状况”, “职业”、“关系”、“种族”、“性别”、“资本收益”, “资本损失”、“每周小时数”、“本国”、“班级”] #试图替换?与Nan一起使用na_值 rawfile=pd.read\u csv(文件名,标题

我是熊猫的新手,我正在尝试在数据帧中加载csv。我的数据缺少表示为?的值,我试图用标准缺失值替换它-NaN

请帮我做这个。我试着通读熊猫的文档,但我不能理解

def readData(文件名):
数据标签=[“年龄”、“工人阶级”、“fnlwgt”、“受教育程度”、“受教育人数”、“婚姻状况”,
“职业”、“关系”、“种族”、“性别”、“资本收益”,
“资本损失”、“每周小时数”、“本国”、“班级”]
#试图替换?与Nan一起使用na_值
rawfile=pd.read\u csv(文件名,标题=None,名称=DataLabels,na\u值=[“?”]))
年龄=原始文件[“年龄”]
印刷品(年龄)
打印(原始文件[25:40])
#=========试图替换?
替换(“?”,“NaN”)
打印(原始文件[25:40])
返回原始文件
年龄工人阶级fnlwgt教育教育人数婚姻状况职业关系种族性别资本收益资本损失每周小时本国阶级
25 56当地政府216851单身汉13已婚公民配偶技术支持丈夫白人男性0 0 40美国>50K
26 19私人168294 HS毕业生9未婚工艺维修亲生子女白人男性0 0 40美国50K
28 39私人367260 HS毕业生9离异高管管理层不在家庭白人男性0 0 80美国使用numpy.nan

使用numpy.nan

好的,我是通过:

 #========trying to replace ?
    newraw= rawfile.replace('[?]', np.nan, regex=True)
    print newraw[25:40]
好的,我是通过:

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

您可以使用
replace
,仅为该列替换此字段:

df['workclass'].replace('?', np.NaN)
或者对于整个df:

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

好的,我解决了您的问题,默认情况下,如果您不传递分隔符,则
read\u 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 

您可以使用
replace
,仅为该列替换此字段:

df['workclass'].replace('?', np.NaN)
或者对于整个df:

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

好的,我解决了您的问题,默认情况下,如果您不传递分隔符,则
read\u 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 

有时会出现空白,与?在informatica或HANA等系统生成的文件中

首先,您需要去除数据帧中的空白

temp_df_trimmed = temp_df.apply(lambda x: x.str.strip() if x.dtype == "object" else x)
然后应用该函数替换数据

temp_df_trimmed['RC'] = temp_df_trimmed['RC'].map(lambda x: np.nan if x=="?"  else x)

有时会出现空白,与?在informatica或HANA等系统生成的文件中

首先,您需要去除数据帧中的空白

temp_df_trimmed = temp_df.apply(lambda x: x.str.strip() if x.dtype == "object" else x)
然后应用该函数替换数据

temp_df_trimmed['RC'] = temp_df_trimmed['RC'].map(lambda x: np.nan if x=="?"  else x)
df=df.replace({'?':np.NaN})

使用Dictionary将任何值替换为NaN

df=df.replace({'?':np.NaN})

使用Dictionary将任何值替换为NaN


伙计们,有很多方法,这是最好的,如果您认为您的CSV文件中有任何像“丢失”这样的NAN对象,只需使用

    rawfile = pd.read_csv("Property_train.csv", na_values=["missing"])

伙计们,有很多方法,这是最好的,如果您认为您的CSV文件中有任何像“丢失”这样的NAN对象,只需使用

    rawfile = pd.read_csv("Property_train.csv", na_values=["missing"])

重要的是,默认情况下,
df.replace()
不是就地函数。如果您想在源数据帧中进行更改,有两种方法:
df=df.replace('?',np.NaN)
df.replace('?',np.NaN,inplace=True)
@GusevSlava,这一点非常有用。谢谢。重要的是,默认情况下,
df.replace()
不是就地函数。如果您想在源数据帧中进行更改,有两种方法:
df=df.replace('?',np.NaN)
df.replace('?',np.NaN,inplace=True)
@GusevSlava,这一点非常有用。谢谢。如果您是从CSV加载数据,或者使用数字数据,我建议您查看另一相关:如果您是从CSV加载数据,或者使用数字数据,我建议您查看另一相关:欢迎使用堆栈溢出!请注意,您正在回答一个非常古老且已回答的问题。这是一个关于堆栈溢出的指南。欢迎使用堆栈溢出!请注意,您正在回答一个非常古老且已回答的问题。这是一本关于旅游的指南。