赞
踩
目录
NaN是一个特殊的浮点数值,它表示缺失数据或不可用数据。在Pandas中,NaN表示一个缺失或无效的值,它是一个Python float对象。当我们在DataFrame中找到NaN时,我们通常希望使用其他值(如0)替换它,以便继续进行数据操作。
a.用np.nan生成空缺数值
- import numpy as np
- import pandas as pd
-
- x = pd.Series([1, np.nan])
- print(x)
- print(x[1])
- print(type(x[1]))
'运行
运行结果
- 0 1.0
- 1 NaN
- dtype: float64
- nan
- <class 'numpy.float64'>
b.创建None
在下面的代码中,创建了None值。
- import pandas as pd
-
- x = pd.Series(["1", None])
- print(x)
- print(x[1])
- print(type(x[1]))
'运行
运行结果
- 0 1
- 1 None
- dtype: object
- None
- <class 'NoneType'>
c.None自动转换为 NaN 值
在下面的测试中,None 值会自动转换为 NaN 值,因为该list中的其他数值是数字, Pandas 自动将 None 转换为 NaN。NaN类型对于很多算术操作来更简单,因此被优先考虑。
- import pandas as pd
- x = pd.Series([1, None])
-
- print(x)
- print(x[1])
- print(type(x[1]))
'运行
运行结果
- 0 1.0
- 1 NaN
- dtype: float64
- nan
- <class 'numpy.float64'>
为什么我们说,使用 NaN 类型对于许多常用操作会更有利?
因为NaN对许多算术运算来说是合法的。 例如,下面涉及None的操作会报错:
None + 1
运行报错
- ---------------------------------------------------------------------------
-
- TypeError Traceback (most recent call last)
-
- <ipython-input-8-3fd8740bf8ab> in <module>
- ----> 1 None + 1
-
-
- TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
但如果是NaN类型,就不会报错。
- import numpy as np
-
- x = np.nan + 1
- print(x) # nan
- print(x == np.nan) # false
- # 因为不能直接判断是否为nan,需要用相应函数
'运行
首先可以使用 numpy,函数 np.isnan() 可以检查一个值是否为 NaN 值,但它不适用于 None 值。
- import numpy as np
-
- ret = np.isnan(np.nan)
- print(ret) # True
-
- # ret = np.isnan(None)
- # TypeError: ufunc 'isnan' not supported for the input types
'运行
另一方法, isnull() 可以用来检测缺失值, nan 或 None 都将为 True。
- print(np.isnan(np.nan)) # True
- print(pd.isnull(None)) # True
如果isnull()返回真,且isnan出现TypeError,说明是None类型。
- import pandas as pd
- import numpy as np
-
-
- data = pd.DataFrame({'Qu1': [np.nan, 3, 4, 3, 4],
- 'Qu2': [2, 3, 1, 2, 3],
- 'Qu3': [1, 5, 2, np.nan, np.nan]},
- index = list('abcde'))
- print(data)
- # Qu1 Qu2 Qu3
- # a NaN 2 1.0
- # b 3.0 3 5.0
- # c 4.0 1 2.0
- # d 3.0 2 NaN
- # e 4.0 3 NaN
-
- data.fillna(999, inplace = True)
- print(data)
'运行
DataFrame填充缺失值可以统一填充,也可以前向和后向填充:前向填充就是将空值填充为它上一个索引对应的值,如果是多个空值相连,则将这多个相连的空值填充为它们上面不为空值的那个值。
- data.fillna(method='ffill', inplace = True)
- print(data)
- # Qu1 Qu2 Qu3
- # a NaN 2 1.0
- # b 3.0 3 5.0
- # c 4.0 1 2.0
- # d 3.0 2 2.0
- # e 4.0 3 4.0
-
- data.fillna(method='bfill', inplace = True)
- print(data)
Pandas中的fillna方法可用于将NaN替换为指定的值。我们可以使用该方法将DataFrame中的NaN替换为零。以下是使用该方法的示例代码:
- import pandas as pd
-
- data = {'A': [1, 2, np.nan, 4],
- 'B': [5, np.nan, 7, 8],
- 'C': [9, 10, 11, np.nan]}
-
- df = pd.DataFrame(data)
- print(df)
-
- df_filled = df.fillna(0)
- print(df_filled)
输出:
- A B C
- 0 1.0 5.0 9.0
- 1 2.0 NaN 10.0
- 2 NaN 7.0 11.0
- 3 4.0 8.0 NaN
-
- A B C
- 0 1.0 5.0 9.0
- 1 2.0 0.0 10.0
- 2 0.0 7.0 11.0
- 3 4.0 8.0 0.0
如上所示,NaN值已被成功地替换为零
除了使用fillna方法之外,我们还可以使用replace方法将NaN转换为零。
与fillna方法不同的是,replace方法还可以用于替换其他指定的值,而不仅仅是NaN。
以下是使用replace方法的示例代码:
- import pandas as pd
- import numpy as np
-
- data = {'A': [1, 2, np.nan, 4],
- 'B': [5, np.nan, 7, 8],
- 'C': [9, 10, 11, np.nan]}
-
- df = pd.DataFrame(data)
- print(df)
-
- df_filled = df.replace(np.nan, 0)
- print(df_filled)
'运行
输出
- A B C
- 0 1.0 5.0 9.0
- 1 2.0 NaN 10.0
- 2 NaN 7.0 11.0
- 3 4.0 8.0 NaN
-
- A B C
- 0 1.0 5.0 9.0
- 1 2.0 0.0 10.0
- 2 0.0 7.0 11.0
- 3 4.0 8.0 0.0
- import pandas as pd
-
- df2 = pd.DataFrame(data=[[None, "x"], ["y", None],
- ["hello world"]],
- columns=["A", "B"])
- print(df2)
- '''
- A B
- 0 None x
- 1 y None
- 2 hello world None
- '''
-
- print(df2["A"][0]) # None
- print(type(df2["A"][0])) # <class 'NoneType'>
-
- # 将为None的值变为"==="
- ret = df2.applymap(lambda x: "===" if x is None else x)
- print(ret)
- '''
- A B
- 0 === x
- 1 y ===
- 2 hello world ===
- '''
'运行
- data = pd.DataFrame([[1,6.5,3],
- [1,np.nan,np.nan],
- [np.nan,np.nan,np.nan],
- [np.nan,6.5,3]
- ])
- data.dropna()
- #输出
- # 0 1 2
- #0 1.0 6.5 3.0
对DataFrame来说,dropna方法如果发现缺失值,就会进行整行删除
不过可以指定删除的方式,how=all,是当整行全是nan的时候才进行删除,同时还可以按指定的轴删除。
- data.dropna(how='all',axis=1,inplace=True)
- data
- #输出
- # 0 1 2
- #0 1.0 6.5 3.0
- #1 1.0 NaN NaN
- #2 NaN NaN NaN
- #3 NaN 6.5 3.0
还可以限制为指定的某些列存在空值时才删除整行数据
- # 指定一些列中若含有空值,则去掉对应的行
- all_column = ["name", "date", "time", "quantity"]
- subset = all_column[1:-1]
- df_trade.dropna(subset=subset, how='any', inplace=True)
剔除掉df类型数据某列数据中为空所在的行
data=data[pd.isnull(data['column_name'])==False]
- import pandas as pd
- import numpy as np
-
-
- data = pd.DataFrame({'Qu1': [np.nan, 3, 4, 3, 4],
- 'Qu2': [2, 3, 1, 2, 3],
- 'Qu3': [1, 5, 2, 4, np.nan]},
- index = list('abcde'))
- print(data)
- # Qu1 Qu2 Qu3
- # a NaN 2 1.0
- # b 3.0 3 5.0
- # c 4.0 1 2.0
- # d 3.0 2 4.0
- # e 4.0 3 NaN
-
- result = data.isnull()
- print(result)
- # Qu1 Qu2 Qu3
- # a True False False
- # b False False False
- # c False False False
- # d False False False
- # e False False True
'运行
判断df某一项的值是否为空
判断DataFrame中某一项的值是否为空的方法有两种:
1.通过pd.isnull()来判断,语法格式:
nan 或 None 都将为 True
- import pandas as pd
-
- pd.isnull(data.loc[i,'column_name'])
- pd.isnull(data.loc[i,'column_name'])==True
- if not pd.isnull(data.loc[i,'column_name']):
- pass
2.通过np.nan 来比较判断,语法格式:
nan将为 True
df['column_name'][i] is not np.nan
如果这个 DataFrame
只有列名,但是没有实际数据,会被 DataFrame.empty
判定为空
如果这个 DataFrame
仅由 缺失值 (NaN)
构成,不会被 DataFrame.empty
判定为空
- import numpy as np
- import pandas as pd
-
-
- df1 = pd.DataFrame(data=None)
- print(df1.empty) # True
-
- df2 = pd.DataFrame(data=[np.nan, np.nan])
- print(df2)
- '''
- 0
- 0 NaN
- 1 NaN
- '''
- print(df2.empty) # False
-
-
- df3 = pd.DataFrame(data=[np.nan, 2])
- print(df3.empty) # False
'运行
一个简单例子
df['A'] = df['A'].astype(int)
再一个例子,像在format函数中,用"06d"这类参数将整数类型格式化为指定格式的字符串时,元素只能是整数类型,当数据存在空值时会被加载为NaN值,如果其属于浮点数类型,则对NaN调用format函数时会报错
ValueError: Unknown format code 'd' for object of type 'float'
因此需要先将其为NaN的行去掉,然后需要将包含NaN的列转换为int类型需要先将其为NaN的行去掉,然后需要将包含NaN的列转换为int类型
- all_column = ["name", "date", "time", "quantity"]
-
- # 指定一些列中若含有空值,则去掉对应的行
- subset = all_column[1:-1]
- df_trade.dropna(subset=subset, how='any', inplace=True)
-
- # 浮点数类型转化为整数类型
- for col in subset:
- df_trade[col] = df_trade[col].astype(int)
注意NaN为float类型时,.astype(int)
转换,会发生错误
ValueError: cannot convert float NaN to integer
一个常见的替换值是0。您可以使用fillna()
方法将所有NaNs替换为0,然后使用.astype(int)
将该列转换为int类型。以下是一个示例代码:
df['A'] = df['A'].fillna(0).astype(int)
end
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。