在继续阅读本篇文章之前,
重要的是要理解NaN和None之间的区别。一个是浮点类型,另一个是对象类型。Pandas更适合使用标量类型,因为这些类型上的许多方法可以进行矢量化。Pandas确实尝试一致地处理None和NaN,但NumPy不能。
我的建议(
和安迪的建议)是坚持使用NaN。
但是为了回答你的问题...
pandas >= 0.18:使用
read_csv
的
na_values = ['-']
参数
如果您从CSV / Excel加载此数据,我有好消息告诉您。您可以在数据加载期间使用
pd.read_*
函数(例如
read_csv
和
read_excel
)接受
na_values
属性来消除根源。
file.csv
A,B
-,1
3,-
2,-
5,3
1,-2
-5,4
-1,-1
-,0
9,0
现在,要将
- 字符转换为NaN,请执行以下操作,
import pandas as pd
df = pd.read_csv('file.csv', na_values=['-'])
df
A B
0 NaN 1.0
1 3.0 NaN
2 2.0 NaN
3 5.0 3.0
4 1.0 -2.0
5 -5.0 4.0
6 -1.0 -1.0
7 NaN 0.0
8 9.0 0.0
对于其他函数/文件格式也是类似的。
附:在v0.24+版本中,即使您的列具有NaN(是的,说到同时拥有蛋糕并吃掉它),您也可以保留整数类型。您可以指定dtype='Int32'
df = pd.read_csv('file.csv', na_values=['-'], dtype='Int32')
df
A B
0 NaN 1
1 3 NaN
2 2 NaN
3 5 3
4 1 -2
5 -5 4
6 -1 -1
7 NaN 0
8 9 0
df.dtypes
A Int32
B Int32
dtype: object
dtype不是传统的int类型,而是可空整数类型。还有其他选项。
处理数字数据: 使用pd.to_numeric
和errors='coerce'
如果你正在处理数字数据,更快的解决方案是使用pd.to_numeric
和errors='coerce'
参数,它将无效值(无法转换为数字的值)强制转换为NaN。
pd.to_numeric(df['A'], errors='coerce')
0 NaN
1 3.0
2 2.0
3 5.0
4 1.0
5 -5.0
6 -1.0
7 NaN
8 9.0
Name: A, dtype: float64
为了保留(可空)整数数据类型,请使用{{}}。
pd.to_numeric(df['A'], errors='coerce').astype('Int32')
0 NaN
1 3
2 2
3 5
4 1
5 -5
6 -1
7 NaN
8 9
Name: A, dtype: Int32
要强制多个列,使用apply
:
df[['A', 'B']].apply(pd.to_numeric, errors='coerce').astype('Int32')
A B
0 NaN 1
1 3 NaN
2 2 NaN
3 5 3
4 1 -2
5 -5 4
6 -1 -1
7 NaN 0
8 9 0
......并在之后将结果分配回去。
更多信息可以在这个答案中找到。
write_frame
函数是否无法将NaN
解析为none
? - Andy HaydenInternalError: (1054, u"Unknown column 'nan' in 'field list'")
错误。我不知道除了在执行write_frame
方法之前将NaN
转换为None
之外还有什么解决方法。 - Blaszardna_values
参数将这些值读入为NaN。更多信息请参见此答案。 - cs95