この投稿に進む前に、NaNとNoneの違いを理解することが重要です。1つはフロート型で、もう1つはオブジェクト型です。Pandasは、スカラータイプの多くのメソッドをベクトル化できるため、スカラータイプの操作に適しています。PandasはNoneとNaNを一貫して処理しようとしますが、NumPyはできません。
私の提案(およびAndyの提案)は、NaNに固執することです。
しかし、あなたの質問に答えるために...
pandas> = 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整数型です。他のオプションがあります。
数値データの処理: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
(null許容)整数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