How can I replace all the NaN values with Zero's in a column of a pandas dataframe
我有一个数据框如下
1 2 3 4 5 6 7 8 9 10 11 12 | itm Date Amount 67 420 2012-09-30 00:00:00 65211 68 421 2012-09-09 00:00:00 29424 69 421 2012-09-16 00:00:00 29877 70 421 2012-09-23 00:00:00 30990 71 421 2012-09-30 00:00:00 61303 72 485 2012-09-09 00:00:00 71781 73 485 2012-09-16 00:00:00 NaN 74 485 2012-09-23 00:00:00 11072 75 485 2012-09-30 00:00:00 113702 76 489 2012-09-09 00:00:00 64731 77 489 2012-09-16 00:00:00 NaN |
当我尝试将一个函数应用于Amount列时,我得到以下错误。
1 | ValueError: cannot convert float NaN to integer |
我尝试使用数学模块中的.isnan来应用函数
我试过了pandas .replace属性
我尝试了pandas 0.9的.sparse数据属性
我也尝试过函数中的NaN == NaN语句。
我也看过这篇文章如何在R数据帧中用零替换NA值? 同时看一些其他文章。
我尝试的所有方法都没有工作或者没有认识到NaN。
任何提示或解决方案将不胜感激。
我相信
链接到数据框和系列的文档。
例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | In [7]: df Out[7]: 0 1 0 NaN NaN 1 -0.494375 0.570994 2 NaN NaN 3 1.876360 -0.229738 4 NaN NaN In [8]: df.fillna(0) Out[8]: 0 1 0 0.000000 0.000000 1 -0.494375 0.570994 2 0.000000 0.000000 3 1.876360 -0.229738 4 0.000000 0.000000 |
要仅在一列中填充NaN,请仅选择该列。在这种情况下,我使用inplace = True来实际更改df的内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | In [12]: df[1].fillna(0, inplace=True) Out[12]: 0 0.000000 1 0.570994 2 0.000000 3 -0.229738 4 0.000000 Name: 1 In [13]: df Out[13]: 0 1 0 NaN 0.000000 1 -0.494375 0.570994 2 NaN 0.000000 3 1.876360 -0.229738 4 NaN 0.000000 |
切片无法保证返回视图或副本。你可以做
1 | df['column'] = df['column'].fillna(value) |
您可以使用
1 2 3 4 5 6 7 8 9 10 11 | import pandas as pd import numpy as np # for column df['column'] = df['column'].replace(np.nan, 0) # for whole dataframe df = df.replace(np.nan, 0) # inplace df.replace(np.nan, 0, inplace=True) |
我只是想提供一些更新/特殊情况,因为看起来人们仍然来到这里。如果您正在使用多索引或使用索引切片器,则inplace = True选项可能不足以更新您选择的切片。例如,在2x2级别的多索引中,这不会更改任何值(从pandas 0.15开始):
1 2 | idx = pd.IndexSlice df.loc[idx[:,mask_1],idx[mask_2,:]].fillna(value=0,inplace=True) |
"问题"是链接打破了fillna更新原始数据帧的能力。我把"问题"放在引号中,因为设计决策有充分的理由导致在某些情况下不通过这些链解释。此外,这是一个复杂的例子(虽然我真的遇到过它),但同样可能适用于较少级别的索引,具体取决于您的切片方式。
解决方案是DataFrame.update:
1 | df.update(df.loc[idx[:,mask_1],idx[[mask_2],:]].fillna(value=0)) |
它是一行,读取得相当好(有点)并消除了任何不必要的中间变量或循环的混乱,同时允许您将fillna应用于您喜欢的任何多级切片!
如果任何人都可以找到不起作用的地方,请在评论中发帖,我一直在搞乱它并查看源代码,它似乎至少解决了我的多索引切片问题。
以下代码对我有用。
1 2 3 4 5 | import pandas df = pandas.read_csv('somefile.txt') df = df.fillna(0) |
填写缺失值的简便方法: -
填充字符串列:当字符串列具有缺失值和NaN值时。
1 | df['string column name'].fillna(df['string column name'].mode().values[0], inplace = True) |
填充数字列:当数字列具有缺失值和NaN值时。
1 | df['numeric column name'].fillna(df['numeric column name'].mean(), inplace = True) |
用零填充NaN:
1 | df['column name'].fillna(0, inplace = True) |
考虑上表中的特定列
1 | df['Amount'] = df.Amount.fillna(0).astype(int) |
同样,您可以使用各种数据类型填充它,如
特别是,我会考虑数据类型来比较同一列的各种值。
如果您要将其转换为pandas数据帧,您还可以使用
1 2 3 4 5 6 | import numpy as np df=np.array([[1,2,3, np.nan]]) import pandas as pd df=pd.DataFrame(df) df.fillna(0) |
这将返回以下内容:
1 2 3 4 5 | 0 1 2 3 0 1.0 2.0 3.0 NaN >>> df.fillna(0) 0 1 2 3 0 1.0 2.0 3.0 0.0 |
替换pandas中的na值
1 | df['column_name'].fillna(value_to_be_replaced,inplace=True) |
if
主要有两种选择;如果插入或填充缺失值NaN / np.nan只有数字替换(跨列:
从文档:
value:标量,字典,系列或DataFrame
用于填充孔的值(例如0),交替a
dict / Series / DataFrame值指定要用于的值
每个索引(对于Series)或列(对于DataFrame)。 (价值不是
在dict / Series / DataFrame中不会被填充)。这个值不能
成为一个清单。
这意味着'字符串'或'常数'不再允许被推算。
对于更专业的插补,使用SimpleImputer():
1 2 3 | from sklearn.impute import SimpleImputer si = SimpleImputer(strategy='constant', missing_values=np.nan, fill_value='Replacement_Value') df[['Col-1', 'Col-2']] = si.fit_transform(X=df[['C-1', 'C-2']]) |
您还可以使用词典填充DataFrame中特定列的NaN值,而不是使用某个oneValue填充所有DF。
1 2 3 4 5 6 7 8 9 10 11 12 | import pandas as pd df = pd.read_excel('example.xlsx') df.fillna( { 'column1': 'Write your values here', 'column2': 'Write your values here', 'column3': 'Write your values here', 'column4': 'Write your values here', . . . 'column-n': 'Write your values here'} , inplace=True) |