提示:文章寫完後,目錄可以自動生成,如何生成可參考右邊的幫助文檔
[email protected]
- 一、作用
- 二、numpy
- 三、pandas
-
-
- pandas不同于numpy的點在于,pandas将資料表格化,有行名、列名,增加對行列操作
- 查找
- 改值
- 處理空資料
- 檔案讀取儲存
- concat合并df表格
- 表格内連接配接、外連接配接
- merge,on:基于key列(某共有列)進行合并
- 以行号做key進行合并
-
- 總結
一、作用
基于c,加速資料計算
二、numpy
- 建立數組
# 導入并取别名
import numpy as np
# np.array函數産生ndarray對象
array = np.array([[1, 2, 3], [2, 3, 4]])
# dtype資料類型
a = np.array([1, 2, 3], dtype=np.int64)
# ndim數組維數
print(a, a.ndim, a.shape, a.size, a.dtype)
- 一維數組運算
b = np.array([10, 20, 30, 40])
# arange産生從0開始的一維數組
c = np.arange(4)
d = b ** 2 + np.tan(c)
print(d)
- 矩陣運算
a = np.array([[1, 1],
[0, 1]])
# arange産生從0開始的一維數組,reshape變成矩陣
b = np.arange(4).reshape((2, 2))
# 矩陣乘法有兩種:
# 1.逐個相乘
c = a * b
# 2.矩陣乘法
c_dot = np.dot(a, b)
# a是ndarray,可直接調用其dot函數,和上面一個意思,寫法不同
c_dot2 = a.dot(b)
# random.random 随機生成3行4列0.0-1.0浮點數
a = np.random.random((3, 4))
print(a)
# 從每列中取出最大值
print(np.max(a, axis=1))
4.numpy索引、平均值、中位數、累差
A = np.arange(2, 14).reshape((3, 4))
# 計算最小值的索引
print(np.argmin(A))
# 計算最大值的索引
print(np.argmax(A))
# 計算平均值,axis:1是對行平均,0是列
print(np.mean(A))
print(A.mean())
# 計算中位數
print(np.median(A))
# 累加:前一位依次加到後一位
print(np.cumsum(A))
# 累差:依次計算相鄰數的內插補點
print(np.diff(A))
# nonzero輸出非0數的索引(包含一個行索引和列索引)
5.對矩陣操作
# arange從小到大 預設步長1,從大到小需設定步長為負數
A = np.arange(14, 2, -1).reshape((3, 4))
# sort是對各行排序
print(np.sort(A))
# 矩陣轉置
print(np.transpose(A))
print(A.T)
# 截斷:類似門檻值 濾波,小于最小值的數變成最小值,大于最大值的數變成最大值
print(np.clip(A, 4, 9))
切片,按行、列列印,降維
# 矩陣索引切片
A = np.arange(3,15).reshape((3, 4))
# (:)切片數學表示[,)
print(A[1, 1:3])
# 可使用for循環列印出每一行
for row in A:
print(row)
# 将A轉置可列印出列
for column in A.T:
print(column)
# flatten将矩陣降維成一維數組
print(A.flatten())
for item in A.flat:
print(item)
- array合并
A = np.array([1,1,1])
B = np.array([2, 2, 2])
# vstack上下合并
C = np.vstack((A, B))
# hstack左右合并,矩陣拼接
D = np.hstack((A, B))
升維、清單變矩陣
# 一維向量變矩陣,橫向數列變縱向
print(A.reshape(3,1))
# mat.T可以一維變矩陣,array不行
# tip:處理矩陣用matrix,數組用
F = np.mat([1,1,1])
# np.newaxis增加新次元,放列上可将一維數組轉化成矩陣
print(A[:, np.newaxis])
B = np.array([2, 2, 2])[:, np.newaxis]
矩陣合并
# array數組是(3,0),使用[:, np.newaxis]在列上增加次元,變成矩陣,才能用concatena
A = np.array([1,1,1])[:, np.newaxis]
B = np.array([2, 2, 2])[:, np.newaxis]
# np.concatenate對多個矩陣橫向或縱向合并
G = np.concatenate((A,A,B,B,),axis=0)
矩陣分割
# array分隔,split(),0為上下分割,1為左右分割
A = np.arange(12).reshape((3,4))
# np.split隻能平均分割;np.array_split可以進行不等分割,原理類似每次對一個array做對折
print(np.split(A,3,axis=0))
# 縱向分割
print(np.vsplit(A,3))
# 橫向分割
print(np.hsplit(A,2))
copy、deep copy
# np中array用=指派,起引用效果,一個array值改變,所有指派array都改變(淺拷貝:指向同一位址)
# is 比較對象的位址,==比較對象的值
a = np.array([1,2,3])
b = a
# 深拷貝:指派但不關聯,指向不同位址
c = a.copy()
d = a[:]
# 真正意義上的深拷貝
e = a.__deepcopy__()
三、pandas
pandas不同于numpy的點在于,pandas将資料表格化,有行名、列名,增加對行列操作
查找
- Series以表格形式列印出元素
date_range以日期形式列印
DatetimeIndex([‘2022-08-15’, ‘2022-08-16’, ‘2022-08-17’, ‘2022-08-18’,
‘2022-08-19’, ‘2022-08-20’],
dtype=‘datetime64[ns]’, freq=‘D’)
index設定行名稱,columns設定列名稱,DataFrame中行列名預設從0開始
df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=['a','b','c','d'])
運作結果
a b c d
2022-08-15 0.538968 0.253723 0.202965 0.840419
2022-08-16 -1.816145 -0.838663 0.080068 0.335355
2022-08-17 -2.003523 -0.334556 -0.600103 -0.865847
2022-08-18 0.533522 -0.846731 -0.042258 0.985196
2022-08-19 -1.273009 -0.596692 -0.208470 0.829764
2022-08-20 -1.249748 -0.421765 0.048790 -0.353773
df2 = pd.DataFrame({'A':1.,
'B':pd.Timestamp('20220815'),
'C':pd.Series(1,index=list(range(4)),dtype='float32'),
'D':np.array([3]*4,dtype='int32'),
'E':pd.Categorical(["test","train","test","train"]),
'F':'fool'})
運作結果:
A B C D E F
0 1.0 2022-08-15 1.0 3 test fool
1 1.0 2022-08-15 1.0 3 train fool
2 1.0 2022-08-15 1.0 3 test fool
3 1.0 2022-08-15 1.0 3 train fool
df2.dtypes檢視資料形式
df2.index檢視行名
df2.colums檢視列名
df2.values檢視所有的值
df2.describe()列印所有是數字的列,以及部分資料統計
運作結果
A C D
count 4.0 4.0 4.0
mean 1.0 1.0 3.0
std 0.0 0.0 0.0
min 1.0 1.0 3.0
25% 1.0 1.0 3.0
50% 1.0 1.0 3.0
75% 1.0 1.0 3.0
max 1.0 1.0 3.0
df2.T轉置,data不變,行名、列名互換
df2.sort_index(axis= 0, ascending=False)可按行列名大小排序(資料跟着改變),ascending确定升序
df2.sort_values(by=‘E’)按e列資料大小改變行序
當列名是字元串,可直接.列名,列印出該列元素(沒法.行名取行,取行用df[切片]來取)
- pands取指定列:
print(df2.A)
print(df2['A']) //效果一樣
- pands取指定:
print(df[0:3])
print(df['20220815':'20220820']) //切片中用行号和行名取,效果一樣
- 通過标簽(行名/列名)選取:.loc
- 通過位置切片選取: .iloc
print(df.iloc[3:5, 1:])
print(df.iloc[[1,3,5], 1:])
混合選取(标簽、位置切片結合):.ix ix已經被棄用,用iloc替代
- 布爾索引篩選(可以把符合要求資料對應的整行資料列印)
改值
print(df[(df.A>8)&(df.B<20)])
運作結果:
A B C D
d 12 13 14 15
e 16 17 18 19
如果沒有定義标簽,不能用loc進行values修改
df.loc['a','B']=222
df..iloc[2,2]= 222
區分
df.A[df.A>4]=0 //隻改變A列
A B C D
a 0 1 2 3
b 4 5 6 7
c 0 9 10 11
d 0 13 14 15
e 0 17 18 19
f 0 21 22 23
df[df.A>4]= 0 //符合條件行對應所有元素都變
A B C D
a 0 1 2 3
b 4 5 6 7
c 0 0 0 0
d 0 0 0 0
e 0 0 0 0
f 0 0 0 0
- 加空列
df['F'] = np.nan
把連續values加到固定行上
處理空資料
- 删除nan資料對應的行(0)或列(1)
any隻要有一個nan就删本行/列,all本行/列全為nan才删
- 填充nan資料
判斷是否nan
df.isnull() //傳回整個表格的判斷值
np.any(df.isnull() == True) //判斷整個表是否有nan,隻傳回一個布爾
檔案讀取儲存
# padas以read_**形式讀取(格式csv,excel,hdf,sql,json,msgpack,html,gbq,stata,sas,cil[board,pickle)
data =pd.read_csv("E:/我的材料/大學生材料/1731資訊登記.csv")
# 以to_**形式儲存(格式同上)
data.to_pickle("E:/我的材料/大學生材料/1731資訊登記.pickle")
concat合并df表格
df1 = pd.DataFrame(np.ones((3,4))*0,columns=['a','b','c','d'])
df2 = pd.DataFrame(np.ones((3,4))*1,columns=['a','b','c','d'])
df3 = pd.DataFrame(np.ones((3,4))*2,columns=['a','b','c','d'])
# concat合并df表格,
# axis:0合并行,行數改變;1合并列,列增加。
# ignore_index=true,更正行号
res = pd.concat([df1,df2,df3],axis=0,ignore_index=True)
print(res)
運作結果
a b c d
0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0
3 1.0 1.0 1.0 1.0
4 1.0 1.0 1.0 1.0
5 1.0 1.0 1.0 1.0
6 2.0 2.0 2.0 2.0
7 2.0 2.0 2.0 2.0
8 2.0 2.0 2.0 2.0
表格内連接配接、外連接配接
外連接配接
df1 = pd.DataFrame(np.ones((3,4))*0,columns=['a','b','c','d'],index=[1,2,3])
df2 = pd.DataFrame(np.ones((3,4))*1,columns=['b','c','d','e'],index=[2,4,5])
# 行列号不一樣時,考慮join屬性;outer拼接成一大塊,沒資料的補nan;inner做并集,隻保留相交部分
res = pd.concat([df1,df2],join='outer')
運作結果:
a b c d e
1 0.0 0.0 0.0 0.0 NaN
2 0.0 0.0 0.0 0.0 NaN
3 0.0 0.0 0.0 0.0 NaN
2 NaN 1.0 1.0 1.0 1.0
4 NaN 1.0 1.0 1.0 1.0
5 NaN 1.0 1.0 1.0 1.0
内連接配接
res = pd.concat([df1,df2],join='inner',ignore_index=True)
運作結果:
b c d
0 0.0 0.0 0.0
1 0.0 0.0 0.0
2 0.0 0.0 0.0
3 1.0 1.0 1.0
4 1.0 1.0 1.0
5 1.0 1.0 1.0
concat的join_index屬性已被棄用
使用merge方法替代
# left_index:為True時将左表的索引作為連接配接鍵,預設為False
# how:兩個資料連接配接方式,預設為inner,可設定inner、outer、left或right
res = pd.merge(df1,df2,how='left',left_index=True,right_index=True)
concat普适,join用于左右合并,append用于上下合并,ignore_index可用于前面三者進行修飾。
append加一行資料
res= df1.append(df2,ignore_index=True) //加一個表dataframe
s1 = pd.Series([1,2,3,4],index= ['a','b','c','d']) //加一行元素
res = df1.append(s1,ignore_index=True)
merge,on:基于key列(某共有列)進行合并
選擇一列合并
left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
# on選擇基于哪一列進行合并
res = pd.merge(left, right, on='key')
選擇2個列合并
# innner保留兩個表共有的key對應的行,outer把所有都複制下來(空資料補nan)
# left以第一個表的key為底,把表2中被表1包含的key行複制到新表;right同理
res = pd.merge(left, right, on=['key1','key2'],how=inner)
merge的提示屬性indicator,顯示怎麼合并的;預設false不打開;true打開;也可=‘自定義本列名’
res = pd.merge(left, right, on=['key1','key2'],how=inner,indicator=True) //true打開提示合并方式
res = pd.merge(left, right, on=['key1','key2'],how=inner,indicator='indicator_column') //='自定義本列名'
以行号做key進行合并
不需要用on,用left_index=True,right_index=True
suffixes=[‘_boy’,‘_girl’]把除key列外的列加字尾,來表明本列資料出自哪個表
res = pd.merge(boys,girls,on= 'k',suffixes=['_boy','_girl'],how='outer')
運作結果:
k age_boy age_girl
0 k0 1.0 2.0
1 k0 1.0 5.0
2 k1 2.0 NaN
3 k2 3.0 NaN
4 k3 NaN 3.0
總結
提示:這裡對文章進行總結:
例如:以上就是今天要講的内容,本文僅僅簡單介紹了pandas的使用,而pandas提供了大量能使我們快速便捷地處理資料的函數和方法。