pandas教程:series和dataframe
起步
pandas是一種Python數據分析的利器,是一個開源的數據分析包,最初是應用于金融數據分析工具而開發出來的,因此pandas為時間序列分析提供了很好的支持。pandas是PyData項目的一部分。
官網:http://pandas.pydata.org/
官方文檔:http://pandas.pydata.org/pandas-docs/stable/
安裝與導入
安裝方式
Python的Anaconda發行版,已經安裝好pandas庫,不需要另外安裝
使用Anaconda界面安裝,選擇對應的pandas進行勾選安裝即可
使用Anaconda命令安裝:conda install pandas
使用PyPi安裝命令安裝:pip install pandas
導入:
from pandas import Series, DataFrame import pandas as pdPandas的數據類型
Pandas基于兩種數據類型: series 與 dataframe 。
**Series:**一種類似于一維數組的對象,是由一組數據(各種NumPy數據類型)以及一組與之相關的數據標簽(即索引)組成。僅由一組數據也可產生簡單的Series對象。注意:Series中的索引值是可以重復的。
**DataFrame:**一個表格型的數據結構,包含有一組有序的列,每列可以是不同的值類型(數值、字符串、布爾型等),DataFrame即有行索引也有列索引,可以被看做是由Series組成的字典。
Series
一個series是一個一維的數據類型,其中每一個元素都有一個標簽。類似于Numpy中元素帶標簽的數組。其中,標簽可以是數字或者字符串。
- series屬性
| 1 | axes | 返回行軸標簽列表。 |
| 2 | dtype | 返回對象的數據類型(dtype)。 |
| 3 | empty | 如果系列為空,則返回True。 |
| 4 | ndim | 返回底層數據的維數,默認定義:1。 |
| 5 | size | 返回基礎數據中的元素數。 |
| 6 | values | 將系列作為ndarray返回。 |
| 7 | head() | 返回前n行。 |
| 8 | tail() | 返回最后n行。 |
- pandas.Series( data, index, dtype, copy)
| 1 | data | 數據采取各種形式,如:ndarray,list,constants |
| 2 | index | 索引值必須是唯一的和散列的,與數據的長度相同。 默認np.arange(n)如果沒有索引被傳遞。 |
| 3 | dtype | dtype用于數據類型。如果沒有,將推斷數據類型 |
| 4 | copy | 復制數據,默認為false。 |
創建series方式
通過一維數組方式創建
import numpy as np import pandas as pd s = pd.Series([1, 2, 5, np.nan, 6, 8]) print(s)輸出:
0 1.0 1 2.0 2 5.0 3 NaN 4 6.0 5 8.0 dtype: float64從ndarray創建一個系列
data = np.array(['a','b','c','d']) ser02 = pd.Series(data) ser02#指定索引 data = np.array(['a','b','c','d']) # ser02 = pd.Series(data,index=[100,101,102,103]) ser02 = pd.Series(data,index=['name','age','sex','address']) ser02輸出:
0 a 1 b 2 c 3 d dtype: objectname a age b sex c address d dtype: object從字典創建一個系列
字典(dict)可以作為輸入傳遞,如果沒有指定索引,則按排序順序取得字典鍵以構造索引。 如果傳遞了索引,索引中與標簽對應的數據中的值將被拉出。
data = {'a':1,'b':2,'c':3} ser03 = pd.Series(data) ser03#指定索引 data = {'a':1,'b':2,'c':3} ser03 = pd.Series(data,index = ['a','b','c','d']) ser03#標量創建 ser04 = pd.Series(5,index = [0,1,2,3]) ser04輸出:
a 1 b 2 c 3 dtype: int64a 1.0 b 2.0 c 3.0 d NaN dtype: float640 5 1 5 2 5 3 5 dtype: int64Series值的獲取
Series值的獲取主要有兩種方式:
- 通過方括號+索引的方式讀取對應索引的數據,有可能返回多條數據
- 通過方括號+下標值的方式讀取對應下標值的數據,下標值的取值范圍為:[0,len(Series.values));另外下標值也可以是負數,表示從右往左獲取數據
Series獲取多個值的方式類似NumPy中的ndarray的切片操作,通過方括號+下標值/索引值+冒號(:)的形式來截取series對象中的一部分數
#引入模塊 import pandas as pd import numpy as np #檢索第一個元素。 ser05 = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e']) print(ser05[1]) print(ser05['a']) print(ser05['d'])輸出:
2 1 4 #檢索系列中的前三個元素 ser05 = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e']) #通過索引來獲取數據 print(ser05[:3]) print(ser05[::2]) print(ser05[4:2:-1]) #通過標簽(下標值)來獲取數據 print(ser05['b':'d']) ser05['a':'d':2] ser05['e':'c':-1] ser05[['a','b']]輸出:
a 1 b 2 c 3 dtype: int64 a 1 c 3 e 5 dtype: int64 e 5 d 4 dtype: int64 b 2 c 3 d 4 dtype: int64a 1 b 2 dtype: int64Series的運算
#引入模塊 import pandas as pd import numpy as npseries = pd.Series({'a':941,'b':431,'c':9327}) series#輸出大于500的值 series[series>500]#計算加 series+10#計算減 series-100#計算乘 series*10#兩個系列相加 ser01 = pd.Series([1,2,3]) ser02 = pd.Series([4,5,6]) ser01+ser02#)計算各個元素的指數e的x次方 e 約等于 2.71828 np.exp(series)np.abs(series)#sign()計算各個元素的正負號: 1 正數,0:零,-1:負數 np.sign(series)Series自動對齊
當多個series對象之間進行運算的時候,如果不同series之間具有不同的索引值,那么運算會自動對齊不同索引值的數據,如果某個series沒有某個索引值,那么最終結果會賦值為NaN。
#引入模塊 import pandas as pd import numpy as np serA = pd.Series([1,2,3],index = ['a','b','c']) serB = pd.Series([4,5,6],index = ['b','c','d']) print('---------serA+serB---------') print(serA) serA+serB輸出:
---------serA+serB--------- a 1 b 2 c 3 dtype: int64a NaN b 6.0 c 8.0 d NaN dtype: float64Series及其索引的name屬性
Series對象本身以及索引都具有一個name屬性,默認為空,根據需要可以進行賦值操作
DataFrame
一個dataframe是一個二維的表結構。Pandas的dataframe可以存儲許多種不同的數據類型,并且每一個坐標軸都有自己的標簽。你可以把它想象成一個series的字典項。
dataFrame屬性
| 1 | T | 轉置行和列。 |
| 2 | axes | 返回一個列,行軸標簽和列軸標簽作為唯一的成員 |
| 3 | dtypes | 返回此對象中的數據類型(dtypes)。 |
| 4 | empty | 如果NDFrame完全為空[無項目],則返回為True; 如果任何軸的長度為0。 |
| 5 | ndim | 軸/數組維度大小。 |
| 6 | shape | 返回表示DataFrame的維度的元組。 |
| 7 | size | NDFrame中的元素數。 |
| 8 | values | NDFrame的Numpy表示。 |
| 9 | head() | 返回開頭前n行。 |
| 10 | tail() | 返回最后n行。 |
####dataframe創建方式
pandas中的DataFrame可以使用以下構造函數創建
- pandas.DataFrame( data, index, columns, dtype, copy)
| 1 | data | 數據采取各種形式,如:ndarray,series,map,lists,dict,constant和另一個DataFrame。 |
| 2 | index | 對于行標簽,要用于結果幀的索引是可選缺省值np.arrange(n),如果沒有傳遞索引值。 |
| 3 | columns | 對于列標簽,可選的默認語法是 - np.arange(n)。 這只有在沒有索引傳遞的情況下才是這樣。 |
| 4 | dtype | 每列的數據類型。 |
| 5 | copy | 如果默認值為False,則此命令(或任何它)用于復制數據。 |
創建一個 DateFrame:
#創建日期索引序列 dates =pd.date_range('20130101', periods=6) print(type(dates)) #創建Dataframe,其中 index 決定索引序列,columns 決定列名 df =pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD')) print(df)輸出:
<class 'pandas.core.indexes.datetimes.DatetimeIndex'> A B C D 2013-01-01 0.406575 -1.356139 0.188997 -1.308049 2013-01-02 -0.412154 0.123879 0.907458 0.201024 2013-01-03 0.576566 -1.875753 1.967512 -1.044405 2013-01-04 1.116106 -0.796381 0.432589 0.764339 2013-01-05 -1.851676 0.378964 -0.282481 0.296629 2013-01-06 -1.051984 0.960433 -1.313190 -0.093666字典創建 DataFrame
df2 =pd.DataFrame({'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"]), 'F':'foo' }) print(df2)輸出:
A B C D E F 0 1.0 2013-01-02 1.0 3 test foo 1 1.0 2013-01-02 1.0 3 train foo 2 1.0 2013-01-02 1.0 3 test foo 3 1.0 2013-01-02 1.0 3 train foo從列表創建DataFrame
data = [1,2,3,4] df02 = pd.DataFrame(data) df02輸出:
0 0 1 1 2 2 3 3 4從列表字典來創建DataFrame
data = {'Name':['Tom','Jack','Steve'],'Age':[19,18,20]} # df04 = pd.DataFrame(data) #指定行索引和列索引 df04 = pd.DataFrame(data,index = ['rank1','rank2','rank3'],columns = ['Name','Age','Sex']) df04輸出:
Name Age Sex rank1 Tom 19 NaN rank2 Jack 18 NaN rank3 Steve 20 NaN從字典列表創建數據幀DataFrame
data = [{'a':1,'b':2},{'a':1,'b':2,'c':3}] # df05 = pd.DataFrame(data) #傳遞字典列表指定行索引 # df05 = pd.DataFrame(data,index = ['first','second']) #傳遞字典列表指定行索引,列索引 df05 = pd.DataFrame(data,index = ['first','second'],columns = ['a','b','c','d']) df05輸出:
a b c d first 1 2 NaN NaN second 1 2 3.0 NaN從系列的字典來創建DataFrame
data = {'one':pd.Series([1,2,3],index = ['a','b','c']),'two':pd.Series([1,2,3,4],index = ['a','b','c','d']) } df06 = pd.DataFrame(data) df06輸出:
one two a 1.0 1 b 2.0 2 c 3.0 3 d NaN 4dataFrame數據操作
列選擇
#直接通過列索引來獲取某一列的值 data = {'one':pd.Series([1,2,3],index = ['a','b','c']),'two':pd.Series([1,2,3,4],index = ['a','b','c','d']) } df06 = pd.DataFrame(data) df06df06['one'] # df06.one # df06.ix[:,'one'] # df06.loc[:,'one'] # df06.iloc[:,0]列添加
data = {'one':pd.Series([1,2,3],index = ['a','b','c']),'two':pd.Series([1,2,3,4],index = ['a','b','c','d']) } df06 = pd.DataFrame(data) df06['three'] = pd.Series([10,20,30],index = ['a','b','c']) df06列修改
#直接通過列名進行修改 df06['three'] = [7,8,9,10] df06列刪除
data = {'one':pd.Series([1,2,3],index = ['a','b','c']),'two':pd.Series([1,2,3,4],index = ['a','b','c','d']),'three':pd.Series([10,20,30],index = ['a','b','c']) } df06 = pd.DataFrame(data) #使用del刪除列 # del(df06['three'])#使用pop刪除 df06.pop('two') df06行選擇
data = {'one':pd.Series([1,2,3],index = ['a','b','c']),'two':pd.Series([1,2,3,4],index = ['a','b','c','d']),'three':pd.Series([10,20,30],index = ['a','b','c']) } df06 = pd.DataFrame(data) df06#可以通過將行標簽傳遞給loc函數或者ix函數來選擇行 # df06.loc['a'] df06.loc[:,'two'] # df06.ix['a']# 按整數位置選擇 # 可以通過將整數位置傳遞給iloc函數來選擇行。參考以下示例代碼 - df06.iloc[2]# 行切片 # 可以使用:運算符選擇多行。參考以下示例代碼 - df06[2:4]行添加
# df06.ix['e'] = [22,33,444] df06.loc['e'] = [22,33,444] df06# 添加加行 # 使用append()函數將新行添加到DataFrame。 此功能將附加行結束。 #創建一行數據 # data2 = pd.DataFrame([{'one':22,'two':33,'three':44}],index = ['e']) data2 = pd.DataFrame([[22,33,44]],columns = ['one','two','three'],index = ['f']) # data2 df06 = df06.append(data2) df06行刪除
df06 = df06.drop('e') df06文章有不當之處,歡迎指正,如果喜歡微信閱讀,你也可以關注我的微信公眾號:cplus人工智能算法后端技術,獲取優質學習資源。
總結
以上是生活随笔為你收集整理的pandas教程:series和dataframe的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: numpy学习4:NumPy基本操作
- 下一篇: 带你学python基础:变量和基本数据类