Python 指定文字列を欠損値NaN(float型)へ置換する「pandas×numpy」

'22/05/21更新:全体の要素に対する処理方法に加えて、特定の列に対する処理方法も追記しました。
 本記事では、pandasデータフレームに対して、各要素の値が指定した文字列の場合に、欠損値NaN(float型)へ置換する雛形コードを載せました。pandasのmask()メソッドで置換できます。

▼全体の要素に対して置換する場合 

df2 = df.mask(df == '-', np.nan)

▼特定の要素に対して置換する場合 

df2 = df.copy()
df2['y'] = df['y'].mask(df['y'] == '-', np.nan)

 下図はその例です。下図左の「-」を下図右の「NaN」へ置換します。このNaNは文字列ではなく、numpyで作成したfloat型であって、pandasで欠損値として扱うことができます。

f:id:HK29:20210512130022p:plain

■本プログラム

#!/usr/bin/env python
# coding: utf-8

# In[1]:


# csvファイルを読み込む
import pandas as pd

df = pd.read_csv('test_data.csv')
df


# In[2]:


# 文字列型'-'をfloat型のNaNに置換する場合
import numpy as np

print('type -> ', type('-'))
print('np.nan -> ', type(np.nan))

# mask()メソッドで、置換できる
# 全体の要素に対して処理する場合
df2 = df.mask(df == '-', np.nan)

# 特定の列に対して処理する場合 
#df2 = df.copy()
#df2['y'] = df['y'].mask(df['y'] == '-', np.nan) df2 # In[3]: # 各列の型の確認 df2.dtypes # In[4]: # 全列の型をfloat型へ変換 df2 = df2.astype('float')
# 特定の列の型を変換する場合
#df2['y'] = df['y'].astype('float')

df2.dtypes # In[5]: # 各列の欠損値の数を確認 df2.isna().sum() # In[6]: # 欠損値のある行を削除する場合は、dropna()を使う df3 = df2.dropna(axis=0) df3 # In[7]: # インデックスをリセットする場合 df4 = df3.reset_index(drop=True) df4 # In[8]: # インデックスを1から振り直す場合 df4.index = np.arange(1, len(df4) + 1) df4

以上

<広告>