天天看點

numpy&pandas一、作用二、numpy三、pandas總結

提示:文章寫完後,目錄可以自動生成,如何生成可參考右邊的幫助文檔

[email protected]

  • 一、作用
  • 二、numpy
  • 三、pandas
      • pandas不同于numpy的點在于,pandas将資料表格化,有行名、列名,增加對行列操作
    • 查找
    • 改值
    • 處理空資料
    • 檔案讀取儲存
    • concat合并df表格
    • 表格内連接配接、外連接配接
    • merge,on:基于key列(某共有列)進行合并
    • 以行号做key進行合并
  • 總結

一、作用

基于c,加速資料計算

二、numpy

  1. 建立數組
# 導入并取别名
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)
           
  1. 一維數組運算
b = np.array([10, 20, 30, 40])
# arange産生從0開始的一維數組
c = np.arange(4)
d = b ** 2 + np.tan(c)
print(d)
           
  1. 矩陣運算
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)
           
  1. 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将資料表格化,有行名、列名,增加對行列操作

查找

  1. 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提供了大量能使我們快速便捷地處理資料的函數和方法。