1. 程式人生 > 程式設計 >Python使用Pandas庫常見操作詳解

Python使用Pandas庫常見操作詳解

本文例項講述了Python使用Pandas庫常見操作。分享給大家供大家參考,具體如下:

1、概述

Pandas 是Python的核心資料分析支援庫,提供了快速、靈活、明確的資料結構,旨在簡單、直觀地處理關係型、標記型資料。Pandas常用於處理帶行列標籤的矩陣資料、與 SQL 或 Excel 表類似的表格資料,應用於金融、統計、社會科學、工程等領域裡的資料整理與清洗、資料分析與建模、資料視覺化與製表等工作。

資料型別:Pandas 不改變原始的輸入資料,而是複製資料生成新的物件,有普通物件構成的一維陣列成為Series,由Series構成的二維陣列表稱為DataFrame,其行被稱為index,列為Colum。

安裝:如果使用anaconda整合環境則會自動安裝numpy、scipy、pandas等資料科學包,也可以通過python包管理工具安裝pandas:

pip install pandas

2、資料物件的建立

通過Series()函式包裹一維陣列可以建立Series物件,其中陣列的元素可以是各種型別。

通過DataFrame()函式包裹二維陣列可以建立一個DataFrame物件,可以通過引數index、columns指定行標籤和列標籤。也可以通過python的字典型別初始化DataFrame,其鍵名預設為列標籤

import pandas as pd
import numpy as np
 
# 通過一維陣列初始化Series
s = pd.Series([1,2.0,np.nan,'test'])
print(s)
 
# 通過二維陣列初始化DataFrame
arr = np.random.randn(6,4)
arr_df = pd.DataFrame(arr,index=np.arange(1,7),columns=list('ABCD'))
print(arr_df)
# 通過字典dict初始化DataFrame
dic = {'A': 1.,'B': pd.Timestamp('20130102'),'C': pd.Series(1,index=list(range(4)),dtype='float32'),'D': np.array([3] * 4,dtype='int32'),'E': pd.Categorical(["test","train","test","train"])
    }
dic_df = pd.DataFrame(dic)
print(dic_df)

其執行結果如下:

# Series資料
0    1
1    2
2   NaN
3  test
dtype: object
# 二維陣列的DataFrame
     A     B     C     D
1 -0.085417 -0.816502 1.495134 -0.277742
2 1.657144 -0.203346 0.631930 -1.182239
3 -2.303923 -0.535696 1.315379 0.129682
4 0.133198 -0.239664 -2.004494 0.119965
5 -1.454717 2.114255 -0.538678 -0.580361
6 -0.759183 0.141554 -0.243270 2.840325
# dict字典DataFrame
   A     B  C D   E
0 1.0 2013-01-02 1.0 3  test
1 1.0 2013-01-02 1.0 3 train
2 1.0 2013-01-02 1.0 3  test
3 1.0 2013-01-02 1.0 3 train

3、檢視資料

函式head(n)可以檢視DataFrame前n行的資料,tail(n)檢視倒數n行的資料

index()檢視DataFrame的行標籤,columns顯示列標籤

describe()按列顯示資料的統計資訊,包括計數、均值、方差、最小最大值等。

函式mean()顯示所有列的均值,mean(1)顯示所有行的均值

sum()求所有列的均值,sum(1)求所有行的均值

DataFrame有一個empty屬性用於判斷是否為空,若為空則返回True

arr = np.random.randn(6,4)
df = pd.DataFrame(arr,columns=list('ABCD'))
print(df.head(3))
print(df.index)
print(df.describe())

結果如下

# 檢視前三行資料
A     B     C     D
1 3.260449 -0.619396 0.070877 1.586914
2 -0.529708 0.071917 -1.919316 1.845727
3 -1.005765 2.176579 -0.323483 -1.295067
# 檢視行標籤
Int64Index([1,2,3,4,5,6],dtype='int64')
# 檢視統計資訊
       A     B     C     D
count 6.000000 6.000000 6.000000 6.000000
mean -0.184606 -0.487184 0.079433 0.855810
std  1.721394 1.800460 1.379498 1.128764
min  -1.443635 -3.091446 -1.919316 -1.295067
25%  -0.967105 -1.430192 -0.281188 0.778729
50%  -0.694488 -0.273739 -0.041713 1.150944
75%  -0.531744 0.197755 0.355731 1.508475
max  3.260449 2.176579 2.352142 1.845727

4、資料的選擇

可以直接通過DataFrame物件選取列或者行,

# 選取一個列A,等價於df['A']
print(df.A)
# 選取第1到第3行,行下標從0開始
print(df[1:3])
 
'''
# 標籤為A的那一列
1  0.644427
2  0.643149
3  1.374668
4  -0.154465
5  -0.338085
6  -1.989284
Name: A,dtype: float64
# 第1~3行
     A     B     C     D
2 0.643149 1.769001 -0.166028 -0.036854
3 1.374668 -0.118593 -0.202222 0.308353
'''

通過loc[]方法可以通過標籤對DataFrame的一行、一列、幾行幾列或者是某個具體的值進行選擇

# 取出行標籤為2的那一行
print(df.loc[2])
# 取出行標籤為1~3,列標籤為'A','B'的內容
print(df.loc[1:3,['A','B']])
# 獲取行標籤為1,列標籤為'A'的具體值,等價於df.at[1,'A']
print(df.loc[1,'A'])
 
'''
# 標籤為2的一行
A  0.681469
B  -0.053046
C  -1.384877
D  -0.447700
Name: 2,dtype: float64
# 標籤為1~3,列標籤為'A','B'的內容
     A     B
1 0.710907 -0.950896
2 0.681469 -0.053046
3 0.781981 0.123072
# 行標籤為1,列標籤為'A'的具體值
0.7109074858947351
'''

除了通過行列標籤來進行取值以外,還可以通過行列的陣列的位置進行取值,其方法名為iloc[]

# 取出第一行,行下標從0開始
print(df.iloc[0])
# 顯示第1,2,4行的第0,2列
print(df.iloc[[1,4],[0,2]])
# 顯示第1行第1列的具體值,等價於df.iat[1,1]
print(df.iloc[1,1])

還可以在選擇時對資料進行過濾

# 輸出A那一列大於0的所有行
print(df[df.A > 0])
df['E'] = ['one','one','two','three','four','three']
# 輸出E那一列存在two、four的所有行
print(df[df['E'].isin(['two','four'])])
 
'''
     A     B     C     D
3 0.168998 -0.732362 -0.098542 0.413128
5 0.513677 -0.163231 -0.098037 -0.606693

     A     B     C     D   E
3 0.168998 -0.732362 -0.098542 0.413128  two
5 0.513677 -0.163231 -0.098037 -0.606693 four
'''

5、操作資料

通過insert()方法可以實現在指定位置插入一列,也可以直接將一個數組賦值給DataFrame,這將預設新增到最後一列

可以通過之前的選擇方法loc、iloc找到指定的行列,然後直接賦值,如果該位置存在資料則會修改,否則新增

通過drop()方法刪除指定的資料,index屬性指定刪除的行,columns指定刪除的列,inplace屬性是否在原資料集上操作,預設為False,此時需要一個變數來接收刪除後的結果

df = pd.DataFrame(data = [['lisa','f',22],['joy',['tom','m','21']],index = [1,3],columns = ['name','sex','age'])
citys = ['ny','zz','xy']
#在第0列,加上column名稱為city,值為citys的數值。
df.insert(0,'city',citys)
jobs = ['student','AI','teacher']
# 預設在df最後一列加上column名稱為job,值為jobs的資料。
df['job'] = jobs
# 若df中沒有index為“4”的這一行的話,則新增,否則修改
df.loc[4] = ['zz','mason',24,'engineer']
print(df)
# 刪除行標籤為1的行
dp=df.drop(index=1)
print(dp)
# 在原資料集上刪除列標籤為sex的列
df.drop(columns=['sex'],inplace=True)
print(df)

結果如下:

# 新增後的資料
 city  name sex age    job
1  ny  lisa  f 22  student
2  zz  joy  f 22    AI
3  xy  tom  m 21  teacher
4  zz mason  m 24 engineer
# 刪除第一行
 city  name sex age    job
2  zz  joy  f 22    AI
3  xy  tom  m 21  teacher
4  zz mason  m 24 engineer
# 刪除sex列
 city  name age    job
1  ny  lisa 22  student
2  zz  joy 22    AI
3  xy  tom 21  teacher
4  zz mason 24 engineer

對DataFrame進行轉置操作,呼叫.T

sort_index(axis=1,ascending=False)對資料進行排序,axis=0代表按行標籤排序,axis=1代表按列標籤排序

sort_values(by='A')按某一列的值對資料進行排序,這裡是按列標籤為A的

apply()函式對DataFrame的每一行應用函式

print(df.T)
si=df.sort_index(axis=1,ascending=False)
print(si)
sv=df.sort_values(by='A')
print(sv)
# 應用匿名函式,用每一列最大值減去最小值
df.apply(lambda x: x.max() - x.min())
print(df)
'''
# 資料轉置
     1     2     3     4     5     6
A -1.176180 -1.301768 0.907088 -1.528101 1.098978 -1.280193
B -0.461954 -0.749642 1.169118 -0.297765 0.531088 -0.999842
C -1.715094 -0.512856 0.511861 -0.247240 1.696772 -0.902995
D 1.336999 0.209091 2.254337 0.649625 -0.049886 -1.514815
# 按列標籤倒序
    D     C     B     A
1 1.336999 -1.715094 -0.461954 -1.176180
2 0.209091 -0.512856 -0.749642 -1.301768
3 2.254337 0.511861 1.169118 0.907088
4 0.649625 -0.247240 -0.297765 -1.528101
5 -0.049886 1.696772 0.531088 1.098978
6 -1.514815 -0.902995 -0.999842 -1.280193
# 按列A的值遞增對行排序
    A     B     C     D
4 -1.528101 -0.297765 -0.247240 0.649625
2 -1.301768 -0.749642 -0.512856 0.209091
6 -1.280193 -0.999842 -0.902995 -1.514815
1 -1.176180 -0.461954 -1.715094 1.336999
3 0.907088 1.169118 0.511861 2.254337
5 1.098978 0.531088 1.696772 -0.049886
# 函式的應用 
A  2.073961
B  2.671590
C  1.785291
D  0.000000
F  4.000000
dtype: float64
'''

panda的concat函式可以將兩個相同型別的DataFrame在行的維度上進行拼接

merge()函式可以將不同DataFrame按列拼接

append()函式可以在DataFrame的結尾追加

# 將第一行和最後一行拼接
print(pd.concat([df[:1],df[-2:-1]]))
# 將第4行追加到結尾
print(df.append(df.iloc[3]))
# 將兩個DataFrame按列拼接
df1 = pd.DataFrame({'row1': ['foo','bar'],'row2': [1,2]})
df2 = pd.DataFrame({'row1': ['foo','row3': [4,5]})
print(pd.merge(df1,df2))
 
'''
# 按行拼接
     A     B     C     D
1 -0.527221 -0.754650 -2.385270 -2.569586
5 0.054059 1.443911 -0.240856 -1.501045
# 追加
     A     B     C     D
1 -0.527221 -0.754650 -2.385270 -2.569586
2 2.123332 -0.013431 -0.574359 -0.548838
3 -0.244057 -0.267805 1.089026 -0.022174
4 -0.789228 1.171906 0.526318 0.046655
5 0.054059 1.443911 -0.240856 -1.501045
6 0.756844 0.623305 -0.597299 0.034326
4 -0.789228 1.171906 0.526318 0.046655
# 按列拼接
 row1 row2 row3
0 foo   1   4
1 bar   2   5
'''

groupby函式可以資料按列進行分組,分組後的結果可以使用for迴圈進行迭代,迭代中每個分組是一個(index,DataFrame)元組,可以對其中的DataFrame作進一步操作。

stack()可以將多列的資料壓縮為兩列顯示

df = pd.DataFrame({'A': ['foo','bar','foo','B': ['one','three'],'C': np.random.randn(4),'D': np.random.randn(4)})
# 按A、B兩列進行分組
dg=df.groupby(['A','B'])
for (index,df) in dg:
    print(df)
# 壓縮
print(df.stack())
 
'''
# 按列分組
   A   B     C     D
3 bar three 0.802027 1.338614
   A  B     C     D
1 bar two -0.567295 0.608978
   A  B    C     D
0 foo one -0.17592 -0.191991
2 foo one -0.72258 0.711312
# 壓縮為兩列
0 A     foo
  B     one
  C   0.622471
  D   0.10633
1 A     bar
  B     two
  C   0.065516
  D  -0.844223
2 A     foo
  B     one
  C  0.0013226
  D   -1.3328
3 A     bar
  B    three
  C  -0.678077
  D   0.785117
dtype: object
'''

Pandas主要使用值np.nan來表示缺失的資料。可以使用dropna(how='any')方法來刪除所有存在空值的行,dropna(axis=1)刪除存在空值的列。fillna(value=x)用指定值x填充所有的空值。

6、其他

通過pandas可以便捷地從其他格式檔案進行轉換

# 將DataFrame寫入csv檔案
df.to_csv('foo.csv')
# 從csv檔案讀資料
df = pd.read_csv('foo.csv')
# excel檔案的讀寫
df = pd.read_excel('foo.xlsx','Sheet1',index_col=None,na_values=['NA'])
df.to_excel('foo.xlsx',sheet_name='Sheet1')

pandas提供了便捷的時間維度生成函式date_range(),第一個引數是起始時間,periods=生成的數量,freq=時間間隔,預設以天為單位

# 從2019年1月1日開始,以秒為單位,生成五個時間
rng = pd.date_range('1/1/2019',periods=5,freq='S')
ts = pd.Series(np.random.randint(0,500,len(rng)),index=rng)
print(ts)
 
'''
2019-01-01 00:00:01  161
2019-01-01 00:00:02  214
2019-01-01 00:00:03  110
2019-01-01 00:00:04  265
Freq: S,dtype: int32
'''

pandas結合matplot可以便捷地進行資料繪圖

ts = pd.Series(np.random.randint(0,index=rng)
# 將資料追加到一個數組統一顯示
ts=ts.cumsum()
# 呼叫matplot繪製圖
ts.plot()

更多關於Python相關內容感興趣的讀者可檢視本站專題:《Python數學運算技巧總結》、《Python資料結構與演算法教程》、《Python函式使用技巧總結》、《Python字串操作技巧彙總》、《Python入門與進階經典教程》及《Python檔案與目錄操作技巧彙總》

希望本文所述對大家Python程式設計有所幫助。