python--Numpy and Pandas 基本語法


  博客地址:http://www.cnblogs.com/yudanqu/

 

  numpy和pandas是python進行數據分析的非常簡潔方便的工具,話不多說,下面先簡單介紹一些關於他們入門的一些知識。下面我盡量通過一些簡單的代碼來解釋一下他們該怎么使用。以下內容並不是系統的知識體系,我只是盡可能把最基礎的知識點列寫一下。

 

一、numpy
1、array

1 import numpy
2 list_1 = [1,2,3,4]
3 array_1 = numpy.array(list_1) # 一維數組
4 list_2 = [4,5,6,7]
5 array_2 = numpy.array([list_1,list_2]) # 二維數組
1 array_2.shape # 查看數組特征,eg:2行4列
2 array_2.size # 查看元素個數, eg:8
3 array_2.dtype # 查看數組類型,eg:int64

注:numpy.arange(n) #與python中的range區別是前面有個a

 

1 numpy.zeros(s) # 全0矩陣,s可以為一個數也可以為一個列表,eg:[2,3]表示2*3的二維數組
2 numpy.eye(a) # 單位矩陣,生成的是浮點數

 

  • 訪問數組中元素:

  一維:array_1[2] 、array_1[1:4]
  二維:array_2[1][2] 、array_2[1,2] 、array_2[:1,1:4]

  其中可以根據python中列表的切片來訪問數據

2、數組與矩陣運算

~~數組array

1 numpy.random.randn(10) # 十個元素的一維數組
2 numpy.random.randint(10,size=20).reshape(4,5) # 產生20個10以內的隨機整數,后面的reshape是將這些數重新寫成一個4*5的二維數組
  • 數組之間維度相同可以直接進行加減乘除(除數不能為0)
  • numpy.unique(array_1) # 找到里面所有的數但不重復
  • sum:二維數組中對每一列求和 sum(array_2)
    • sum(array_2[0) 對第一行求和
    • sum(array_2[:,0] 對第一列求和
  • array_2.max() #求最大值,對某行某列求則同sum

~~矩陣matric

1 numpy.mat([1,2,3],[4,5,6]) # 生成一個二維矩陣
2 numpy.mat(array_1) # 將數組轉換成矩陣

注:矩陣之間維度相同可以直接進行加減運算,而乘除運算需要行和列交叉對應,參照線性代數中的知識。

3、input和output:

 1 import numpy as np 
 2 f = open('x.pkl','wb')
 3 #序列化到硬盤
 4 
 5 #pickle
 6 import pickle
 7 pickle.dump(x,f) # 產生pkl文件
 8 pickle.load(f) # 提取pkl文件
 9 
10 #numpy本身的工具
11 numpy.save('one_array',x)
12 numpy.load('one_array.npy')
13 numpy.savez('two_array.npz',a=x,b=y) # 對多個進行操作,進行壓縮儲存
14 c = numpy.load('two_array.npz') # 提取文件
15 c['a'] #第一個文件
16 c['b'] #第二個文件

 

二、pandas

1、Series

 1 import numpy as np
 2 import pandas as pd
 3 #下面是創建Series的三種方法
 4 #方法1:s1 = pd.Series([1,2,3,4]) 
 5 #方法2:s2 = pd.Series(np.arange(10)) # 通過numpy.arange創建
 6 #方法3:s3 = pd.Series({'1':1,'2':2,'3':3}) # 通過字典創建
 7 s1.values # 查看值
 8 s1.index # 查看索引
 9 s4 = pa.Series([1,2,3,4],index=['A','B','C','D']) # 設置索引
10 s4.to_dict() # 轉化成字典
11 pd.isnull(s4) #判斷其中元素是否為NaN,pd.notnull()同理

2、DataFrame

1 from pandas import Series,DataFrame
2 #通過粘貼板導入dataframe
3 df = pd.read_clipboard() # 在此之前需要你copy一個表
4 df.columns  # 輸出列名
5 df.'列名'  # 輸出列的數值(是一個Series)
6 df_new = DataFrame(df,columns=['列名1','列名2'])
7 s1 = pd.Series(df['列名'])  # 輸出這一列,dataframe的每一列是一個series
8 s1.index\values 即對series操作,或者通過s1['索引值']

 

  • df1.iterrows() #返回一個生成器,可以用for循環來訪問
    • eg: for row in df1.iterrows():
    • print(row) #返回的數據為一個tuple
  • s1,s2,s3為3個Series,用其組成一個人dataframe:
    • df_new = pd.DataFrame([s1,s2,s3],index=['A','B','C'])
    •   # index是每個Series的名稱
    •   # 初始是按橫向拼接成的dataframe
    •   df1 = df1.T #轉置,轉置之后就和直接用dataframe生成的一樣了

三、IO操作:

1、從粘貼板讀取

1 df1 = pd.read_clipboard()
2 df1.to_clipboard() # 寫入粘貼板

2、CSV文件

1 df1.to_csv('名字.csv',index=False) # false則表示不添加索引號
2 df2 = pd.read_csv('df1.csv') # 讀取CSV文件

3、json

1 df1.to_json() # 轉化成json文件
2 pd.read_json(df1.to_json()) # 讀取json文件

4、html

1 df1.to_html('df1_html') # 轉換成HTML文件

5、excel

1 df1.to_excel('df1.xlsx') # 生成Excel文件

四、Selecting and Indexing

1 df.head() # 返回前五行
2 df.tail() # 返回后五行
3 # 返回更多的內容則在括號中寫出來,不寫則默認為五行
4 df.iloc[:,:] #索引切片,定位,基於index,與索引名無關
5 df.loc[:,:] # 根據索引名來,label來過濾

Reindex:

~~series

1 s1.reindex(index=['A','B','C','D','E'],fill_value=10)
2 # fill_value 是指當重新寫的index中有原來沒有的,那么他本身輸出為NaN,fill值為添加到這個索引下的值
3 # 創建一個新Series,另一種賦值的方法
4 s2 = Series(['A','B','C','D'],index=[1,5,10])
5 s2.reindex(index=range(15)) # 生成15個索引的Series,除了原有的其他的都是NaN
6 s2.reindex(index=range(15),method='ffill') # 在上一步的基礎上,按順序將上一個value填充到他下面的幾個中(forward fill)
7 s1.drop('A') # 表示刪除A的內容

~~dataframe

1 # 創建一個5*5的,通過numpy進行reshape
2 df1 = DataFrame(np.random.rand(25).reshape([5,5]),index=['A','B','D','E','F'],colums=['c1','c2','c3','c4','c5']) # 遺漏的index中的C,通過reindex來恢復
3 df1.reindex(index=['A','B','C','D','E','F']) # C被恢復並把value填充為NaN
4 # columns 同理
5 # 當index減少時就表現出切割的現象
6 df1.drop('A',axis=0) # axis=0,代表刪除行;axis=1,代表刪除列(后面遇到axis同樣是這個意思)

五、NaN

  • n = np.nan
    • type(n) 是個浮點數float
    • 與nan的運算結果均是nan

nan in series:

  • s1.isnull\notnull() 判斷是否為nan
  • s1.dropna() # 刪除掉value為NaN的行

nan in dataframe:

  • 判斷同series
1 df.dropna(axis=0,how='any',thresh=None) # axis表示行和列0,1來表示,how為any時表示有Nan就刪掉,為all時表示全為nan時才刪掉;thresh表示一個界限,超過這個數字的nan則被刪掉
2 df.fillna(value=1) # 表示所有為nan的地方填充為1
3 df.fillna(value={0:0,1:1,2:2,3:3}) # 表示第一列的填充1,第二列的填充2,后面同理

注:dropna,fillna不改變原始數組

六、多級index

  • index=[['1','1','1','2','2','2'],['a','b','c','a','b','c']] # 1,2為一級標題,abc為二級標題,即1的series下有abc,原始series下有1,2;獲取內容時,可以s1['1']['a']
  • s1[:,'a'] 返回所有一級series里的a
  • 與dataframe的轉換:
    • df1 = s1.unstack()
  • 逆轉換:
    • s2 = df1.unstack() # 這時一二級換了位置
    • s2 = df1.T.unstack() # 這時是和原始完全一樣的

注:dataframe的index和columns都可以轉換成多級的

七、mapping and replace

當想在一個dataframe中加一列(columns),可以直接加df['列名']=Series([數據])
也可以通過map:創建一個字典,字典中的鍵是dataframe中的columns:
df1['新列名'] = df1['字典中的鍵那一列'].map(那個字典) 這個可以固定對應位置,方便改值,可以指定index來改值

replace in series:

1 s1.replace({1,np.nan}) # 通過字典來改值
2 s1.replace([1,2,3],[10,20,30]) # 把123索引改成10,20,30

 

  作者:漁單渠

  博客地址:http://www.cnblogs.com/yudanqu/

  以上內容是我的一點點總結,希望能給有需要的朋友帶來帶你幫助,也希望有大神來指點指點。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM