pandas中有兩種數據結構Series和DataFrame,Series相似於Numpy中的一維數組,這裏就不詳細記錄了。主要記錄下DataFrame的常見使用。html
DataFrame是一個表格型的數據結構,它含有一組有序的列,每列能夠是不一樣的值類型(數值、字符串、布爾值等)。DataFrame既有行索引也有列索引,它能夠被看作由Series組成的字典(共用同一個索引)。python
下面記錄DataFrame的常見使用,引入pandas約定:數組
from pandas import Series,DataFrame import pandas as pd
1. 建立一個DataFrame數據框數據結構
建立一個DataFrame最多見的方法是傳入一個等長的列表或者Numpy數組組成的字典。app
In [16]: d = { ...: "name":["cat","dog","lion"], ...: "age":[3,5,6], ...: "sex":["male","female","male"] ...: } In [17]: d Out[17]: {'name': ['cat', 'dog', 'lion'], 'age': [3, 5, 6], 'sex': ['male', 'female', 'male']} In [18]: df = pd.DataFrame(d) In [19]: df Out[19]: name age sex 0 cat 3 male 1 dog 5 female 2 lion 6 male
2. 查看數據框的概述函數
In [20]: df.info() <class 'pandas.core.frame.DataFrame'> RangeIndex: 3 entries, 0 to 2 # 三個索引,從0到2 Data columns (total 3 columns): # 字段信息 name 3 non-null object # 字符串類型 age 3 non-null int64 # 整型 sex 3 non-null object # 字符串類型 dtypes: int64(1), object(2) # 統計數據類型信息 memory usage: 152.0+ bytes # 佔用內存大小
3. 切片和索引code
3.1 基於列索引進行切片htm
In [24]: df.age Out[24]: 0 3 1 5 2 6 Name: age, dtype: int64 In [25]: df['age'] Out[25]: 0 3 1 5 2 6 Name: age, dtype: int64 In [26]: df[['age','name']] Out[26]: age name 0 3 cat 1 5 dog 2 6 lion
3.2 基於行索引進行切片
基於行索引進行切片有多種方法,好比DataFrame裏的ix
函數,loc
函數和iloc
函數等。對象
In [27]: df.ix[0] D:\work-enviorament\anaconda\Scripts\ipython:1: DeprecationWarning: .ix is deprecated. Please use .loc for label based indexing or .iloc for positional indexing See the documentation here: http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated Out[27]: name cat age 3 sex male Name: 0, dtype: object
使用ix函數
能夠進行行索引的切片,可是pandas建議使用loc或者iloc。索引
In [28]: df.ix[0:1] D:\work-enviorament\anaconda\Scripts\ipython:1: DeprecationWarning: .ix is deprecated. Please use .loc for label based indexing or .iloc for positional indexing See the documentation here: http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated Out[28]: name age sex 0 cat 3 male 1 dog 5 female In [29]: df[0:1] # 相似列表的切片操做 Out[29]: name age sex 0 cat 3 male In [30]: df[0:2] Out[30]: name age sex 0 cat 3 male 1 dog 5 female
一樣,也可使用相似列表切片的操做進行行索引切片,不過ix函數的這種操做會包括右邊的索引,切的範圍不一樣。
對於切出來的數據,數據類型仍是數據框的,能夠繼續切片(多重切片)。
In [36]: df[0:2]['name'] Out[36]: 0 cat 1 dog Name: name, dtype: object
4. 選取和修改值
In [37]: df Out[37]: name age sex 0 cat 3 male 1 dog 5 female 2 lion 6 male In [38]: df['age'] Out[38]: 0 3 1 5 2 6 Name: age, dtype: int64 In [39]: df['age'] = 10 # 基於整列的值都修改成10 In [40]: df Out[40]: name age sex 0 cat 10 male 1 dog 10 female 2 lion 10 male In [41]: df['age'][0] = 20 # 修改age列的第一行的值爲20 In [42]: df Out[42]: name age sex 0 cat 20 male 1 dog 10 female 2 lion 10 male In [43]: df.age = [3,4,5] # 爲多個字段賦值能夠傳入一個列表 In [44]: df Out[44]: name age sex 0 cat 3 male 1 dog 4 female 2 lion 5 male
5. 數據的篩選
某些狀況下,須要根據一些數據進行篩選,好比篩選出年齡大於5歲的人或者居住地區爲廣州的人等等。
In [44]: df Out[44]: name age sex 0 cat 3 male 1 dog 4 female 2 lion 5 male In [46]: df.age == 4 # 邏輯判斷,年齡等於4的,返回一個Series的布爾型數組 Out[46]: 0 False 1 True 2 False Name: age, dtype: bool In [47]: df[df.age == 4] # 根據這個布爾型數組進行索引,返回爲True的 Out[47]: name age sex 1 dog 4 female In [48]: df[[False,True,False]] # 這種與上面方法是等價的 Out[48]: name age sex 1 dog 4 female In [51]: df.age > 3 # 大於小於也是能夠的 Out[51]: 0 False 1 True 2 True Name: age, dtype: bool
這裏也有個小技巧就是,在這些邏輯判斷操做的前面加上~號,就能夠反轉結果,以下:
In [54]: df.age == 3 Out[54]: 0 True 1 False 2 False Name: age, dtype: bool In [55]: ~(df.age == 3) Out[55]: 0 False 1 True 2 True Name: age, dtype: bool
同時也支持多重篩選
In [57]: df Out[57]: name age sex 0 cat 3 male 1 dog 4 female 2 lion 5 male In [58]: (df.age == 3) & (df.name == 'cat') Out[58]: 0 True 1 False 2 False dtype: bool In [59]: df[(df.age == 3) & (df.name == 'cat')] Out[59]: name age sex 0 cat 3 male
pandas的query函數也能夠達到篩選功能
In [66]: df.query("age == 3") Out[66]: name age sex 0 cat 3 male In [67]: df.query("(age == 3)&(sex=='male')") Out[67]: name age sex 0 cat 3 male
6. 使用loc與iloc
對於DataFrame的行的標籤索引,引入了特殊的標籤運算符loc和iloc。它們可讓你用相似NumPy的標記,使用軸標籤(loc)或整數索引(iloc),從DataFrame選擇行和列的子集。
In [73]: df Out[73]: name age sex 0 cat 3 male 1 dog 4 female 2 lion 5 male In [74]: df.iloc[1] # 根據行標籤進行索引,選取行索引爲1的行 Out[74]: name dog age 4 sex female Name: 1, dtype: object In [75]: df.iloc[0:2] Out[75]: name age sex 0 cat 3 male 1 dog 4 female
若是行標籤不是整數,而是字符串,那麼就可使用loc了。
In [76]: df.index = list('abc') # 將行索引改成abc In [77]: df Out[77]: name age sex a cat 3 male b dog 4 female c lion 5 male In [78]: df.loc['a'] # 選取行索引爲a的行 Out[78]: name cat age 3 sex male Name: a, dtype: object In [79]: df.loc[['a','b']] Out[79]: name age sex a cat 3 male b dog 4 female In [80]: df.iloc[0] # 一樣也可使用iloc Out[80]: name cat age 3 sex male Name: a, dtype: object
iloc是根據具體的行的位置進行索引的,也就無論行標籤是整數仍是字符串類型,而loc是根據行標籤進行索引的。
loc和iloc還有支持多個參數進行索引
In [83]: df Out[83]: name age sex a cat 3 male b dog 4 female c lion 5 male In [84]: df.iloc[0:2] # 選取第一行和第二行 Out[84]: name age sex a cat 3 male b dog 4 female In [85]: df.iloc[0:2,1] # 選取列,列索引從0開始,因此選取第二列的數據 Out[85]: a 3 b 4 Name: age, dtype: int64 In [86]: df.iloc[0:2,[0,1]] # 選取多列 Out[86]: name age a cat 3 b dog 4
7. 丟棄DataFrame的行或者列
丟棄某條軸上的一個或多個項很簡單,只要有一個索引數組或列表便可。因爲須要執行一些數據整理和集合邏輯,因此drop方法返回的是一個在指定軸上刪除了指定值的新對象:
對於DataFrame,能夠刪除任意軸上的索引值。用標籤序列調用drop會從行標籤(axis 0)刪除值:
In [153]: dd Out[153]: name age sex 0 cat 3 male 1 dog 5 female 2 lion 6 male In [154]: dd.drop([1,2]) Out[154]: name age sex 0 cat 3 male
經過傳遞axis=1或axis='columns'能夠刪除列的值:
In [156]: dd Out[156]: name age sex 0 cat 3 male 1 dog 5 female 2 lion 6 male In [157]: dd.drop('sex',axis=1) Out[157]: name age 0 cat 3 1 dog 5 2 lion 6 In [158]: dd.drop('sex',axis='columns') Out[158]: name age 0 cat 3 1 dog 5 2 lion 6
8. DataFrame行,列的添加
如下面數據框爲例:
In [182]: dd Out[182]: name age 0 cat 2 1 dog 3
以字典方式添加一行,忽略索引:
In [190]: row = {'name':'lion','age':4} In [191]: dd.append(row,ignore_index=True) Out[191]: name age 0 cat 2 1 dog 3 2 lion 4
使用loc,添加一行或者修改已存在行的內容:
In [206]: dd Out[206]: name age 0 cat 2 1 dog 3 In [207]: dd.loc[4] = ['lion','4'] In [208]: dd Out[208]: name age 0 cat 2 1 dog 3 4 lion 4 In [209]: dd.loc[1] = ['dog',5] In [210]: dd Out[210]: name age 0 cat 2 1 dog 5 4 lion 4
首先是數據的加載,pandas提供了一些用於將表格型數據讀取爲DataFrame對象的函數,經常使用的有read_csv
和read_table
。
以read_csv爲例:
In [97]: df = pd.read_csv('dataAnalyst_gbk.csv',encoding="gbk") In [98]: df Out[98]: city education top avg work_year 0 上海 本科 9 8.0 3年 1 廣州 碩士 15 11.0 2年 2 廣州 本科 12 10.0 應屆畢業生 3 北京 本科 13 12.0 2年 4 北京 本科 11 8.0 1年
read_csv函數
默認是以utf-8
格式進行文件的加載,而這個dataAnalyst_gbk.csv
文件是gbk格式的,因此須要enconding指定文件格式以解碼。如上代碼所示,read_csv函數將表格型數據加載爲DataFrame對象。
csv文件默認是以逗號爲分隔符,若是想指定分隔符,可使用sep參數,好比下面讀取test.csv文件,而且以t爲分隔符。
df = pd.read_csv('test.csv',sep='\t')
若是想對讀取文件的字段名,也就是第一行的列名進行更改,能夠在讀取文件的時候使用names參數
:
In [111]: df = pd.read_csv('dataAnalyst_gbk.csv',encoding="gbk",names=['a','b','c','d','e']) In [112]: df # 能夠看到列標籤變成了abcde Out[112]: a b c d e 0 city education top avg work_year 1 上海 本科 9 8.0 3年 2 廣州 碩士 15 11 2年 3 廣州 本科 12 10 應屆畢業生 4 北京 本科 13 12 2年 5 北京 本科 11 8 1年
在獲取數據後,即可以對數據進行進一步的分析,清洗等操做,下面記錄一些常見的使用。
1. head()函數,默認顯示前5行
對於一些很是龐大的數據框,使用head()能夠簡要的查看數據,head默認顯示前5行,能夠傳遞數字讓pandas顯示多少行。
In [116]: df.head() Out[116]: city education top avg work_year 0 上海 本科 9 8.0 3年 1 廣州 碩士 15 11.0 2年 2 廣州 本科 12 10.0 應屆畢業生 3 北京 本科 13 12.0 2年 4 北京 本科 11 8.0 1年 In [117]: df.head(3) Out[117]: city education top avg work_year 0 上海 本科 9 8.0 3年 1 廣州 碩士 15 11.0 2年 2 廣州 本科 12 10.0 應屆畢業生
固然,若是想看尾部的數據,能夠用tail函數
,它默認顯示尾部的5行,與head相反。
2. 更改數據類型
使用df.info()
函數能夠看到各個列的數據類型,實際分析中也有需求去更改它的數據類型
In [120]: df.info() <class 'pandas.core.frame.DataFrame'> RangeIndex: 5 entries, 0 to 4 Data columns (total 5 columns): city 5 non-null object education 5 non-null object top 5 non-null int64 avg 5 non-null float64 work_year 5 non-null object dtypes: float64(1), int64(1), object(3) memory usage: 280.0+ bytes
pandas提供了astyp()函數
進行數據類型的更改,例以下面將top列的值的數據類型更換爲字符串類型。
In [122]: df.top Out[122]: 0 9 1 15 2 12 3 13 4 11 Name: top, dtype: int64 # 默認是int64 In [123]: df.top.astype('str') Out[123]: 0 9 1 15 2 12 3 13 4 11 Name: top, dtype: object # 已經更改成字符串類型
須要注意的是df.top.astype('str')
並不會去修改原先數據框的數據類型,而是新建了一個,若是想對原先的數據框進行修改,須要進行賦值操做df.top = df.top.astype('str')
。
In [124]: df.top = df.top.astype('str') In [125]: df.top Out[125]: 0 9 1 15 2 12 3 13 4 11 Name: top, dtype: object
3. 進行一些簡單的數值計算以及篩選過濾
In [129]: df Out[129]: city education top avg work_year 0 上海 本科 9 8.0 3年 1 廣州 碩士 15 11.0 2年 2 廣州 本科 12 10.0 應屆畢業生 3 北京 本科 13 12.0 2年 4 北京 本科 11 8.0 1年 In [130]: df['avg_2'] = df.avg*2 # 增長新的一列,數據爲avg數值的兩倍 In [131]: df Out[131]: city education top avg work_year avg_2 0 上海 本科 9 8.0 3年 16.0 1 廣州 碩士 15 11.0 2年 22.0 2 廣州 本科 12 10.0 應屆畢業生 20.0 3 北京 本科 13 12.0 2年 24.0 4 北京 本科 11 8.0 1年 16.0
找出平均薪資大於10K的數據或者平均薪資大於10K的城市:
In [133]: df.query('avg>10') Out[133]: city education top avg work_year avg_2 1 廣州 碩士 15 11.0 2年 22.0 3 北京 本科 13 12.0 2年 24.0 In [134]: df.query('avg>10').city Out[134]: 1 廣州 3 北京 Name: city, dtype: object