偵測遺失值
# coding: utf-8
# ## 檢測缺失值
# In[2]:
import pandas as pd
import numpy as np
df = pd.DataFrame([ ['frank', 'M', np.nan], ['mary' , np.nan, np.nan], ['tom' , 'M', 35], ['ted' , 'M', 33], ['jean' , np.nan, 21], ['lisa' , 'F', 20]])
df.columns = ['name', 'gender', 'age']
df
# In[38]:
df.isnull()
# In[4]:
# 檢查是否含有缺失值(每個元素)
df['gender']
# In[6]:
df['gender'].isnull() # 傳回一個boolean 的矩陣
# In[13]:
# (某字段)
df.name.isnull().any() # =可疊代對象是否有一個是True,all 相反
# In[23]:
df.gender.isnull().any()
# In[30]:
df.isnull().any()
# In[31]:
df.isnull().values.any() # 先将序列轉為 numpy.ndarray,在判斷是否有缺失值
# In[33]:
# 檢測缺失值的個數
df.gender.isnull().sum()
# In[35]:
df.isnull().sum()
# In[39]:
df.isnull().values.sum()
處理遺失值
1. 當缺失值數量很低時:直接舍棄對應行
2. 其他:使用mean,median,mode,等描述性統計值補齊缺失值
3. 内插法 :interpolate 官方文檔
# coding: utf-8
# In[2]:
import pandas as pd
import numpy as np
df = pd.DataFrame([ ['frank', 'M', np.nan], ['mary' , np.nan, np.nan], ['tom' , 'M', 35], ['ted' , 'M', 33], ['jean' , np.nan, 21], ['lisa' , 'F', 20]])
df.columns = ['name', 'gender', 'age']
df
# ## 删除缺失值
# In[4]:
df.dropna() # 隻要有nan的值就直接舍去該行
# In[9]:
df.dropna(how='all') # 缺失所有變量的行,舍去
# In[11]:
df.dropna(thresh=2) # 缺失變量超過2個,舍去
# In[13]:
# 處理列
df['employee'] = np.nan
df
# In[16]:
df.dropna(axis=1, how='all') # 對于列
# ## 填補缺失值
# In[18]:
df.fillna(0)
# In[22]:
df['age'].fillna(df['age'].mean())
# In[28]:
df.groupby('gender')['age'].mean() # n 進 g 出
# In[35]:
'''
分組 -> 拿出變量(列) -> 計算 - > n 進 n 出
'''
df.groupby('gender')['age'].transform('mean')
# In[36]:
df['age'].fillna(df.groupby('gender')['age'].transform('mean'), inplace=True) #在原資料集操作
df
# In[38]:
# 向前向後補齊
df['age'].fillna(method='ffill')
# In[44]:
df['age'].fillna(method='bfill', limit=1) # limit限制每列可以被替代NaN的數目
# ## 内插法
# In[45]:
df2 = pd.DataFrame([[1, 870], [2, 900], [np.nan, np.nan], [4, 950], [5,1080], [6,1200]])
df2.columns = ['time', 'val']
df2
# In[47]:
df2.interpolate()