1. 程式人生 > >資料分析(五)

資料分析(五)

週末,終於閒了下來。突然想起資料分析的知識還沒整理完。好吧,廢話就不多說了,我們繼續總結相關的知識點。
前面學了series和dataframe,今天我們先說說他們的運算:
【重要】

使用Python操作符:以行為單位操作,對所有行都有效。(類似於numpy中二維陣列與一維陣列的運算,但可能出現NaN)

使用pandas操作函式:

axis=0:以列為單位操作(引數必須是列),對所有列都有效。
axis=1:以行為單位操作(引數必須是行),對所有行都有效。

例子

1.假設ddd1是期中考試成績,ddd2是期末考試成績,請自由建立ddd2,並將其與ddd1相加,求期中期末平均值。

2.假設張三期中考試數學被發現作弊,要記為0分,如何實現?

3.李四因為舉報張三作弊立功,期中考試所有科目加100分,如何實現?

4.後來老師發現有一道題出錯了,為了安撫學生情緒,給每位學生每個科目都加10分,如何實現?

ddd1=DataFrame(data=np.random.randint(0,150,size=(3,3)),index=['張三','李四','王五'],columns=['語文','數學','英語'])
ddd1#檢視輸出結果
ddd2 = DataFrame(data=np.random.randint(0,150,size=(3,3)),index=['張三','李四','王五'],columns=['語文','數學','英語'])
ddd2
(ddd1+ddd2)/2  #算平均分
ddd1.loc['張三','數學']=0 #張三期中數學為0分
ddd1
ddd1.loc['李四']+=100  #李四各科成績均加100分
ddd1
ddd1+=10   #安撫情緒,加十分
ddd1 

閾值判斷
ddd1>100
dataframe和numpy都可以 判斷 然後返回 布林值的資料

空值

一、有兩種丟失資料:
None: Python自帶的資料型別 不能參與到任何計算中
np.nan: float型別 能參與計算,但結果總是nan
二、np.nan(NaN)
陣列直接運算會得到nan,但可以使用np.nan*()函式來計算nan,此時視nan為0。

ndarr = np.array([1,2,3,np.nan])
np.sum(ndarr)
np.nansum(ndarr)

Series和DataForm可以直接處理nan

s1 = Series([1,2,3,np.nan])
s1
s1.sum()
df1 = DataFrame([1,2,3,np.nan])
df1
df1.sum()

三、pandas中的None與NaN

s1 = Series([1,2,3,np.nan,None])  # 
s1
df1 = DataFrame([1,2,3,np.nan,None])  # Series和DataFrame都會自動把None轉換成NaN 然後 運算的時候會把NaN當成0
df1

四、空值檢測與控制處理
空值檢測:
isnull()
notnull()
snull配合any使用,可以檢視每一行是否存在空值

可以控制axis改變方向,檢視某一列是否存在空值
df.isnull() # 是空值就是True否則就是False

# df.isnull().any()  # 檢視某一列是否有空值
# df.isnull().any(axis=1)  # 檢視某一行(樣本)是否有空值

空值過濾
dropna()
可以選擇過濾的是行還是列(預設為行)

df.dropna()  # 預設 保留沒有空值的行

也可以選擇過濾的方式 how = ‘all’
#how=‘any’ how用來設定如何刪除
#預設是any 只要有空就刪除

df.dropna(how=‘all’)
空值填充:
fillna()
可以指定value
#value=None
df.fillna(value=50)
也可以選擇從前面找值來填充還是從後面找值來填充
#method指的是 如何對空值進行填充
#'bfill’從後面找值來填充 ffill從前面找值來填充
#df.fillna(method=‘bfill’)
#df.fillna(method=‘ffill’) # 預設是縱向(從相鄰樣本的 同意特徵中找值)
還可以指定是在尋找值時候的軸線

#df.fillna(method='bfill',axis=0)  # 豎向
df.fillna(method='bfill',axis=1)  # 橫向

fillna()方法總結:
#value=None, method=None, axis=None, inplace=False, limit=None
#value直接指定 用什麼值來填充
#method 指定填充方法
#axis 指定填充值的方向
#inplace 指的是是否對原df進行替換
#limit 限制填充的個數
df.fillna()

pandas的拼接操作

pandas的拼接分為兩種:
級聯:pd.concat, pd.append (沒有重複資料)
合併:pd.merge, pd.join (有重複資料)
簡單級聯
pandas使用pd.concat函式,與np.concatenate函式類似

主要看 objs ignore_index axis 三個引數

不匹配級聯
不匹配指的是級聯的維度的索引不一致。例如縱向級聯時列索引不一致,橫向級聯時行索引不一致

主要看 join keys join_axes 三個引數

使用append()函式新增
由於在後面級聯的使用非常普遍,因此有一個函式append專門用於在後面新增

使用pd.merge()合併
merge與concat的區別在於,merge需要依據某一共同的行或列來進行資料的融合

注意每一列元素的順序不要求一致