天天看點

python - 遺失值處理

偵測遺失值

# 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()