Python Pandas 将多列中的零替换为NaN。

63

将包含人员属性的列表加载到pandas数据框df2中。 为了清理,我想用np.nan替换值为零(0'0')。

df2.dtypes

ID                   object
Name                 object
Weight              float64
Height              float64
BootSize             object
SuitSize             object
Type                 object
dtype: object

将值设置为 np.nan 的工作代码:

df2.loc[df2['Weight'] == 0,'Weight'] = np.nan
df2.loc[df2['Height'] == 0,'Height'] = np.nan
df2.loc[df2['BootSize'] == '0','BootSize'] = np.nan
df2.loc[df2['SuitSize'] == '0','SuitSize'] = np.nan

相信这可以用类似/更短的方法完成:

df2[["Weight","Height","BootSize","SuitSize"]].astype(str).replace('0',np.nan)

然而,上述方法并不起作用。零仍然存在于df2中。如何解决这个问题?

7个回答

119

我认为你需要使用dict来替换,可以参考replace

cols = ["Weight","Height","BootSize","SuitSize","Type"]
df2[cols] = df2[cols].replace({'0':np.nan, 0:np.nan})

1
我想知道为什么这个解决方案有效,而 df2[cols].replace({'0':np.nan, 0:np.nan}, inplace=True) 则会出现错误 A value is trying to be set on a copy of a slice from a DataFrame - Alexandr Kapshuk
这不是一个错误,只是一个警告。基本上,可能存在内存问题。 - Bob
@M.Mariscal - 使用.replace({'.':'') - jezrael
不起作用,我的代码是:cols = ['Total', 'uno', 'dos'] df[cols] = df[cols].replace({'.':''}) 问题出在 to_csv 上,虽然我能看到那个点,但因为它有千位分隔符,所以没有意义……CSV 文件混乱不堪,我需要按升序排序,但找不到正确的方法。 - M. Mariscal

10
你可以使用 'replace' 方法,并将你想要替换的值作为列表作为第一个参数传递,与所需值一起作为第二个参数:
cols = ["Weight","Height","BootSize","SuitSize","Type"]
df2[cols] = df2[cols].replace(['0', 0], np.nan)

5

尝试:

df2.replace(to_replace={
             'Weight':{0:np.nan}, 
             'Height':{0:np.nan},
             'BootSize':{'0':np.nan},
             'SuitSize':{'0':np.nan},
                 })

1
这是我认为最干净的解决方案。你也不需要将其作为关键字参数传递。只需要字典就可以了。参考链接 -> https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.replace.html ,其中 类似字典的 to_replace 部分。 - Nick Brady

3
data['amount']=data['amount'].replace(0, np.nan)
data['duration']=data['duration'].replace(0, np.nan)

3

在“age”列中,用空白替换零

df['age'].replace(['0', 0'], '', inplace=True)

将单列中的零替换为NaN

df['age'] = df['age'].replace(0, np.nan)

将多个列中的零替换为nan

cols = ["Glucose", "BloodPressure", "SkinThickness", "Insulin", "BMI"]

df[cols] = df[cols].replace(['0', 0], np.nan)

将DataFrame中的零值替换为NaN

df.replace(0, np.nan, inplace=True)

1
如果您只想在整个数据框中替换零值,可以直接替换它们而不指定任何列:
df = df.replace({0:pd.NA})

这是最快的方式。 - Paul

0
另一种替代的方法:
cols = ["Weight","Height","BootSize","SuitSize","Type"]
df2[cols] = df2[cols].mask(df2[cols].eq(0) | df2[cols].eq('0'))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接