08,DataFrame建立
DataFrame是一個【表格型】的資料結構,可以看做是【由Series組成的字典】(共用同一個索引)。DataFrame由按一定順序排列的多列資料組成。設計初衷是將Series的使用場景從一維擴充到多維。DataFrame既有行索引,也有列索引。
- 行索引:index
- 列索引:columns
- 值:values(Numpy的二維陣列)
(8.1)DataFrame的建立
最常用的方法是傳遞一個字典來建立。DataFrame以字典的鍵作為每一【列】的名稱,以字典的值(一個陣列)作為每一列。此外,DataFrame會自動加上每一行的索引(和Series一樣)。
同Series一樣,若傳入的列與字典的鍵不匹配,則相應的值為NaN。
DataFrame的基本屬性和方法:
- values 值,二維ndarray陣列
- columns 列索引
- index 行索引
- shape 形狀
- head() 檢視前幾條資料,預設5條
- tail() 檢視後幾條資料,預設5條
其他建立DataFrame的方式
09,DataFrame切片
【注意】直接用中括號時:
- 索引優先對列進行操作
- 切片優先對行進行操作
總結:
- 要麼取一行或一列:索引
- 要麼取連續的多行或多列:切片
- 要麼取不連續的多行或多列:中括號
010,DataFrame運算
(10.1)DataFrame之間的運算
- 在運算中自動補齊不同索引的資料
- 如果索引不對應,則補NaN
- DataFrame沒有廣播機制
建立DataFrame df1 不同人員的各科目成績,月考一
建立DataFrame df2 不同人員的各科目成績,月考二
DataFrame和標量之間的運算
DataFrame之間的運算
使用.add() 函式,填充資料
(10.2)Series與DataFrame之間的運算
- 使用Python運算子:以行為單位操作(引數必須是行),對所有行都有效。
- 類似於NumPy中二維陣列與一維陣列的運算,但可能出現NaN
- 使用Pandas操作函式:
- axis=0:以列為單位操作(引數必須為列),對所有列都有效。
- axis=1:以行為單位操作(引數必須為行),對所有行都有效。
011,建立層次化索引
(11.1)建立多層行索引
(11.1.1)隱式構造
最常見的方法是給DataFrame建構函式的index引數傳遞兩個或更多的陣列
- Series也可以建立多層索引
(11.1.2)顯示構造pd.MultiIndex
- 使用陣列
- 使用tuple
- 使用product
- 笛卡爾積
(11.2)多層列索引
除了行索引index,列索引columns也能用同樣的方法建立多層索引
就是把pd.MultIndex. 移到columns那裡去
012,多層索引中Series的索引和切片操作
(12.1)Series的操作
- 對於Series的操作,直接中括號[] 與使用.loc() 完全一樣
(12.1.1)索引
(12.1.2)切片
013,多層索引中DataFrame的索引和切片操作
(13.1)索引
(13.2)切片
014,索引的堆疊
(14.1)stack():將列索引變成行索引
(14.2)unstack():將行索引變成列索引
(14.3)使用fill_value填充
015,聚合操作
(15.1)DataFrame聚合函式
- 求和
- 平均值
- 最大值
- 最小值等
(15.2)多層索引聚合操作
016,資料合併concat
為方便講解,我們首先定義一個生成DataFrame的函式:
示例:
使用pd.concat()級聯
pandas使用pd.concat函式,與np.concatenate函式類似
(16.1)簡單級聯
-
忽略行索引 ignore_index
-
使用多層索引 keys
(16.2)不匹配級聯
不匹配指的是級聯的維度的索引不一致。例如縱向級聯時列索引不一致,橫向級聯時行索引不一致
-
外連線:補NaN(預設模式)
-
內連線:只連線匹配的項
017,資料合併merge合併1
- 類似於MySQL中表和表直接的合併
- merge與concat的區別在於,merge需要依據某一共同的行或列來進行合併
- 使用pd.merge() 合併時,會自動根據兩者相同column名稱的那一列,作為key來進行合併。
- 每一列元素的順序不要求一致
(17.1)一對一合併
(17.2)多對一合併
(17.3)多對多合併
(17.4)key的規範化
- 使用on = 顯式指定哪一列為key,當2個DataFrame有多列相同時使用
- 使用left_on和right_on指定左右兩邊的列作為key,當左右兩邊的key都不相等時使用
- 當左邊的列和右邊的index相同的時候,使用right_index=True
018,資料合併merge合併2
(18.1)內合併與外合併
- 內合併:只保留兩者都有的key(預設模式)
- 外合併 how='outer':補NaN
- 左合併,右合併:how='left',how='right'
(18.2)列衝突的解決
當列衝突時,即有多個列名稱相同時,需要使用on=來指定哪一個列作為key,配合suffixes指定衝突列名
可以使用suffixes=自己指定字尾
merge合併總結:
- 合併有三種現象:一對一,多對一,多對多。
- 合併預設會找相同的列名進行合併,如果有多個列名相同,用on來指定。
- 如果沒有列名相同,但是資料又相同,可以透過left_on,right_on來分別指定要合併的列。
- 如果想和index合併,使用left_index,right_index來指定。
- 如果多個列相同,合併之後可以透過suffixes來區分。
- 還可以透過how來控制合併的結果,預設是內合併,還有外合併outer,左合併left,右合併right。
019,缺失值處理nan
np.nan是浮點型別,能參與到計算中。但計算的結果總是NaN。
020,缺失值檢測
(20.1)Pandas中None與np.nan都視作np.nan
- 建立DataFrame
- 使用DataFrame行索引與列索引修改DataFrame資料
(20.2)pandas中None與np.nan的操作
(20.2.1)判斷函式
- isnull()
- notnull()
021,缺失值處理_過濾資料
(21.1)使用bool值過濾資料
(21.2)過濾函式dropna
(21.2.1)可以選擇過濾的是行還是列(預設為行)
ps:這裡資料變了
(21.2.2)也可以選擇過濾的方式 how = 'all'
(21.2.3)inplace=True 修改原資料
022,缺失值處理_填充空值
(22.1)填充函式 fillna() Series/DataFrame
(22.2)可以選擇前向填充還是後向填充
重新建立資料
也可以不用重新建立資料,因為沒有用到 inplace=True
023,重複值處理
(23.1)使用duplicated() 函式檢測重複的行
- 返回元素為布林型別的Series物件
- 每個元素對應一行,如果該行不是第一次出現,則元素為True
(23.2)使用drop_duplicates() 函式刪除重複的行
024,替換元素replace
使用replace() 函式,對values進行替換操作
025,資料對映map
map()函式中可以使用lamba函式
026,修改索引名rename
027,重置索引reset_index和設定索引set_index
028,資料處理apply
apply() 函式:既支援 Series,也支援DataFrame
029,資料處理transform
030,異常值檢測和過濾1
(30.1)describe() :檢視每一列的描述性統計量
(30.2)df.std() :可以求得DataFrame物件每一列的標準差
(30.3)df.drop() :刪除特定索引
031, 異常值檢測和過濾2
(31.1)unique() :唯一,去重
(31.2)df.query:按條件查詢
032,異常值檢測和過濾3
(32.1)df.sort_values():根據值排序;df.sort_index():根據索引排序
重新建立資料
035,常用聚合函式(count,max,min,median,sum,mean)
038,資料分組聚合
資料聚合是資料處理的最後一步,通常是要使每一個陣列生成一個單個的數值。
資料分類處理:
- 分組:先把資料分為幾組
- 用函式處理:為不同組的資料應用不同的函式以轉換資料
- 合併:把不同組得到的結果合併起來
資料分類處理的核心:groupby()函式
使用.groups屬性檢視各行的分組情況:
039,CSV資料載入
(39.1)df.to_csv:儲存到csv
(39.2)df.read_csv:載入csv資料