在继续本文之前,重要的是要了解NaN和None之间的区别。一种是浮点类型,另一种是对象类型。熊猫更适合处理标量类型,因为可以对这些类型的许多方法进行矢量化处理。熊猫确实尝试一致地处理None和NaN,但是NumPy无法。
我的建议(和Andy的建议)是坚持使用NaN。
但是要回答你的问题...
熊猫> = 0.18:将na_values=['-']
参数与read_csv
如果您是从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
与其他功能/文件格式类似。
PS:在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类型...而是一个Nullable Integer类型。还有其他选择。
处理数值数据:pd.to_numeric
witherrors='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
要保留(可为空)整数dtype,请使用
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
s吗?