datawhale組對學習——pandas基礎下——缺失數據

學習資源鏈接:pandas缺失數據

一、總覽

在這裏插入圖片描述

二、疑問

1.NaT是對時序版本的缺失值
2.在這裏插入圖片描述
3.請添加圖片描述

請添加圖片描述請添加圖片描述

三、思考題

【問題一】 如何刪除缺失值佔比超過25%的列?

這個倒是不知道

【問題二】 什麼是Nullable類型?請談談爲什麼要引入這個設計?

這是Pandas在1.0新版本中引入的重大改變,其目的就是爲了(在若干版本後)解決之前出現的混亂局面,統一缺失值處理方法

【問題三】 對於一份有缺失值的數據,可以採取哪些策略或方法深化對它的瞭解?

四、練習題

【練習一】現有一份虛擬數據集,列類型分別爲string/浮點/整型,請解決如下問題:¶
(a)請以列類型讀入數據,並選出C爲缺失值的行。
(b)現需要將A中的部分單元轉爲缺失值,單元格中的最小轉換概率爲25%,且概率大小與所在行B列單元的值成正比。
【練習二】 現有一份缺失的數據集,記錄了36個人來自的地區、身高、體重、年齡和工資,請解決如下問題:
(a)統計各列缺失的比例並選出在後三列中至少有兩個非缺失值的行。
(b)請結合身高列和地區列中的數據,對體重進行合理插值。

五、程序代碼以及相關注釋

學習部分

import pandas as pd
import numpy as np
df = pd.read_csv('F:/program study/python/joyful-pandas-master/data/table_missing.csv')
df.head(10)
#複習一下讀入操作

pd.Series([1,np.nan,3],dtype='bool')

s = pd.Series([True,False],dtype='bool')
s[1]=np.nan
s
#在所有的表格讀取後,無論列是存放什麼類型的數據,默認的缺失值全爲np.nan類型
#因此整型列轉爲浮點;而字符由於無法轉化爲浮點,因此只能歸併爲object類型('O'),原來是浮點型的則類型不變
#None在傳入數值類型後,會自動變爲np.nan 只有當傳入object類型是保持不動,幾乎可以認爲,除非人工命名None,它基本不會自動出現在Pandas中

s_original = pd.Series([1, 0], dtype="bool") #此處重新加一句是因爲前面賦值改變了bool類型
s_original[0] = None
s_original
#不懂這裏的運行結果
#此外,和object類型的一點重要區別就在於,在調用字符方法後,string類型返回的是Nullable類型,object則會根據缺失類型和數據類型而改變


df['Physics'].head()

df['Physics'].fillna('missing').head()

#線性插值
s = pd.Series([1,10,15,-5,-2,np.nan,np.nan,28])
s

s.interpolate()
s.interpolate().plot()

作業練習部分

df2 = pd.read_csv('F:/program study/python/joyful-pandas-master/data/Missing_data_one.csv')
df2.head(10)

df2.convert_dtypes().dtypes
#這裏指轉換類型,是把原來的int轉換成Int,object轉換成string,bool轉換成boolean
#原文中提到的
#    它的好處就在於,其中前面提到的三種缺失值都會被替換爲統一的NA符號,且不改變數據類型
#    就像原文中寫的那樣,當賦值爲na類型之後,原本的int變成了float,但是現在的nullable中的Int類型不會變成float,還會是Int類型

df2[df2['C'].isna()]
#請以列類型讀入數據,並選出C爲缺失值的行。

df2 = pd.read_csv('F:/program study/python/joyful-pandas-master/data/Missing_data_one.csv').convert_dtypes()
total_b = df2['B'].sum()
min_b = df2['B'].min()
df2['A'] = pd.Series(list(zip(df2['A'].values
                    ,df2['B'].values))).apply(lambda x:x[0] if np.random.rand()>0.25*x[1]/min_b else np.nan)
df2.head()

#這裏的x[0]表示取第一維,lamba函數是一個沒有名稱的函數,一個臨時的函數
#if語句的用法
#if 判斷條件:
#    執行語句……
#else:
#   執行語句……

# x if condition else y 是一個 python 的專門的語法,等價於 C 裏面的 condition ? x : y,
#如果你沒學過 C 的話,這個語法的含義就是,先判斷 condition 的真假,如果爲真,整個表達式就返回 x,如果爲假就返回 y。

df.isna().sum()/df.shape[0]
df_not2na = df[df.iloc[:,-3:].isna().sum(1)<=1]
df_not2na.head()
#標準答案所給的寫法
#要返回各缺失值的比例,首先我們得用到isna().sum(),然後除以總行數,所以要用到之前學習的shape
#這裏是統計各列缺失的比例並選出在後三列中至少有兩個非缺失值的行。

#自己想的寫法
df_not2na = df[df.loc[-3:].isna().sum(1)<=1]
df_not2na.head()
#自己根據前面所學的知識所給的寫法,換用loc來進行

df_not2na = df[df.loc[:,['體重','年齡','工資']].isna().sum(1)<=1]
df_not2na.head()
#換用loc的另一種方法來進行

#請結合身高列和地區列中的數據,對體重進行合理插值。
#參考答案寫法
df_method_1 = df.copy()
for name,group in df_method_1.groupby('地區'):
    df_method_1.loc[group.index,'體重'] = group[['身高','體重']].sort_values(by='身高').interpolate()['體重']
df_method_1['體重'] = df_method_1['體重'].round(decimals=2)
#df_method_1.head()
df_method_1.plot()

df_method_2 = df.copy()
df_method_2.interpolate(method='index').plot()
#自己寫的按索引進行線性插值

在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章