數據科學庫pandas筆記1

數據結構之DataFrame

pandas中有兩種數據結構Series和DataFrame,Series相似於Numpy中的一維數組,這裏就不詳細記錄了。主要記錄下DataFrame的常見使用。html

DataFrame是一個表格型的數據結構,它含有一組有序的列,每列能夠是不一樣的值類型(數值、字符串、布爾值等)。DataFrame既有行索引也有列索引,它能夠被看作由Series組成的字典(共用同一個索引)。python

下面記錄DataFrame的常見使用,引入pandas約定:數組

from pandas import Series,DataFrame
import pandas as pd

DataFrame基本操做

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_csvread_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
相關文章
相關標籤/搜索