Python數據分析第一課:Pandas初入門

數據分析如下所示共6步,而使用Python可以幫助我們完成前5步。
在這裏插入圖片描述

一. Pandas簡介

Pandas 是基於NumPy 的一種工具,該工具是爲了解決數據分析任務而創建的。Pandas 納入了大量庫和一些標準的數據模型,提供了高效地操作大型數據集所需的工具。Pandas提供了大量能使我們快速便捷地處理數據的函數和方法。

瞭解了Pandas的基本概念,再看一下Pandas在數據分析方面有哪些作用呢?
在這裏插入圖片描述
Pandas提供的數據結構和函數的設計,將使表格化數據的工作快速、簡單、有表現力。所以利用Pandas進行數據操作、預處理、清洗是Python數據分析中的重要技能。

二. Pandas數據結構

常見的數據存儲形式有Excel和數據庫這兩種,他們的存儲有什麼共同點呢?
在這裏插入圖片描述
Pandas的DataFrame的結構就和他們相同,Series的結構和表中的行的結構相同。

import pandas as pd

# 通過Series存儲每個英雄的基本信息
# 創建Series
s1 = pd.Series([1001,'lily','18','150.00','female'])
s2 = pd.Series([1002,'lucy','20','170.00','female'])
s3 = pd.Series([1003,'tomy','22','176.00','male'])
s4 = pd.Series([1004,'lilei','23','178.00','male'])

series_list = [s1,s2,s3,s4]
# 創建一個DataFrame對象存儲通訊錄
df = pd.DataFrame(series_list)
# 打印df
print(df)

# 輸出結果如下:
      0      1   2       3       4
0  1001   lily  18  150.00  female
1  1002   lucy  20  170.00  female
2  1003   tomy  22  176.00    male
3  1004  lilei  23  178.00    male

我們根據df的打印結果進一步解析DataFrame的結構。
在這裏插入圖片描述
整個數據被分爲三部分:行索引(index),列索引(columns)及數據內容(data)。

行、列索引的值在沒有自定義的時候,會被默認設置上0-N的值,索引的作用就是爲了更好的認知和查詢數據。

可以看出每一列數據都是同種類型的數據,如果每一列設定一個有意義的名字,操作的時候就會更加方便。

三. Series的創建

Series是Pandas中最基本的對象,Series類似一種一維數組。事實上,Series 基本上就是基於 NumPy 的數組對象來的。和 NumPy 的數組不同,Series 能爲數據自定義標籤,也就是索引(index),然後通過索引來訪問數組中的數據。

# 導入Series
from pandas import Series,DataFrame

# 創建Series,使用默認索引
se1 = Series(data=[1,'羞羞的尹志平','20','天生愛做色狼,楊過不喜歡他'])
print(se1)

# 輸出結果:
0                1
1           羞羞的尹志平
2               20
3    天生愛做色狼,楊過不喜歡他
dtype: object

一個Series其實就是一條數據,Series方法的第一個參數是data,第二個參數是index(索引),如果沒有傳值會使用默認值(0-N)。

自定義一個索引看看。

# 導入Series
from pandas import Series,DataFrame

# 創建Series,使用自定義索引
se1 = Series(data=[1,'羞羞的尹志平','20','天生愛做色狼,楊過不喜歡他'],index=['序號','姓名','年齡','屬性'])
print(se1)

# 輸出結果:
序號                1
姓名           羞羞的尹志平
年齡               20
屬性    天生愛做色狼,楊過不喜歡他
dtype: object

index參數是我們自定義的索引值,注意:參數值的個數一定要相同。

在創建Series時數據並不一定要是列表,也可以將一個字典傳進去。

# 導入Series
from pandas import Series,DataFrame

# 將字典轉換爲Series
dic = {'name':'小龍女','屬性':'超級漂亮','年齡':'29','備註':'楊過的老婆'}
se2 = Series(data=dic)
print(se2)

# 輸出結果:
name      小龍女
屬性       超級漂亮
年齡         29
備註      楊過的老婆
dtype: object

當數據是字典的時候,會將字典的鍵作爲索引,字典的值作爲索引對應的數據值。

綜上可以看出,Series是一組帶索引數組,與list相似,一般我們用其承裝一條數據或者一行數據。多個Series可組成一個DataFrame。

四. DataFrame的創建

DataFrame(數據表)是一種 2 維數據結構,數據以表格的形式存儲,分成若干行和列。通過 DataFrame,能很方便地處理數據。
調用DataFrame()可以將多種格式的數據轉換爲DataFrame對象,它的的三個參數data、index和columns分別爲數據、行索引和列索引。

# 導入Series
from pandas import Series,DataFrame

# 創建二維列表,存儲人物信息
list = [['楊過','神鵰大俠','善於使用獨臂大刀'],
        ['小龍女','神鵰大俠的妻子','善於使用神鵰大俠的大刀'],
        ['尹志平','神鵰大俠的妻子的仇人','善於使用神鵰大俠的妻子']]

# 創建dataframe
df = DataFrame(data=list)
print(df)

# 輸出結果:
     0           1            2
0   楊過        神鵰大俠     善於使用獨臂大刀
1  小龍女     神鵰大俠的妻子  善於使用神鵰大俠的大刀
2  尹志平  神鵰大俠的妻子的仇人  善於使用神鵰大俠的妻子

list是使用一個二維列表,將每一個人物的信息存儲到一個列表中。

調用DataFrame()將二維列表轉換爲DataFrame對象,行列索引使用的是默認0-N數字代表。

# 導入Series
from pandas import Series,DataFrame

# 創建二維列表,存儲人物信息
list = [['楊過','神鵰大俠','善於使用獨臂大刀'],
        ['小龍女','神鵰大俠的妻子','善於使用神鵰大俠的大刀'],
        ['尹志平','神鵰大俠的妻子的仇人','善於使用神鵰大俠的妻子']]

# 創建dataframe
df = DataFrame(data=list,index=[1,2,3],columns=['姓名','稱號','特長'])
print(df)

# 輸出結果:
    姓名          稱號           特長
1   楊過        神鵰大俠     善於使用獨臂大刀
2  小龍女     神鵰大俠的妻子  善於使用神鵰大俠的大刀
3  尹志平  神鵰大俠的妻子的仇人  善於使用神鵰大俠的妻子

當然我們也可以使用字典來創建一個DataFrame數據。

# 導入Series
from pandas import Series,DataFrame

# 創建字典,存儲人物信息
# list = [['楊過','神鵰大俠','善於使用獨臂大刀'],
#         ['小龍女','神鵰大俠的妻子','善於使用神鵰大俠的大刀'],
#         ['尹志平','神鵰大俠的妻子的仇人','善於使用神鵰大俠的妻子']]

dic = {'姓名':['楊過','小龍女','尹志平'],
       '稱號':['神鵰大俠','神鵰大俠的妻子','神鵰大俠的妻子的仇人'],
       '特長':['善於使用獨臂大刀','善於使用神鵰大俠的大刀','善於使用神鵰大俠的妻子']}
# 創建dataframe
df = DataFrame(dic)
print(df)
 
 # 輸出結果:
     姓名          稱號           特長
0   楊過        神鵰大俠     善於使用獨臂大刀
1  小龍女     神鵰大俠的妻子  善於使用神鵰大俠的大刀
2  尹志平  神鵰大俠的妻子的仇人  善於使用神鵰大俠的妻子

通過結果可以看出當字典格式的數據被dataframe整理後,字典的鍵將作爲數據的列索引值。

五. Series常用屬性與方法

表格數據中的每一列或者每一行的數據結構都是Series,它可以看成是一維的表格數據。

它可以屬於DataFrame的一部分也可以作爲一個獨立的數據結構存在。

from pandas import Series

mp=['001','002','003','004','005','006']
name=['亞瑟', '後裔','小喬','哪吒' ,'虞姬','王昭君']
se = Series(data=name,index=mp)

# 獲取數據的值
print(se.values)
print('-'*20)
# 獲取索引的值
print(se.index.tolist())
print('-'*20)
# 獲取每隊數據與索引的值
print(list(se.items()))

# 輸出結果:
['亞瑟' '後裔' '小喬' '哪吒' '虞姬' '王昭君']
--------------------
['001', '002', '003', '004', '005', '006']
--------------------
[('001', '亞瑟'), ('002', '後裔'), ('003', '小喬'), ('004', '哪吒'), ('005', '虞姬'), ('006', '王昭君')]

values、index、items返回的對象分別是List、Index、Zip類型的數據,爲了方便我們使用和觀察數據,可以使用series.index.tolist()和list(series.items())方法轉化成列表類型。

Series就像將索引值暴露在外面的List,其實它們除了外表相似以外,在獲取數據方面也非常的相似。我們可以通過索引值來進行單個數據的訪問,同樣也支持切片選擇多個數據。

from pandas import Series

mp=['001','002','003','004','005','006']
name=['亞瑟', '後裔','小喬','哪吒' ,'虞姬','王昭君']
se = Series(data=name,index=mp)

# 使用索引獲取單個數值
print(se['002'])
print('-'*20)
# 使用索引獲取多個不連續的數值
print('索引下標')
print(se[['001','003','006']])
print('-'*20)
# 使用索引獲取多個連續的數值
print('索引切片')
print(se['004':'006'])

# 輸出結果:
後裔
--------------------
索引下標
001     亞瑟
003     小喬
006    王昭君
dtype: object
--------------------
索引切片
004     哪吒
005     虞姬
006    王昭君
dtype: object

注意

  • 獲取數據格式—對象名[]
  • 獲取多個不連續數據時是雙層括號— 對象名[[]]
  • 使用切片時使用的是—對象名[:]

那麼, 原來的默認索引去哪裏了呢?其實還是存在的,並且可以使用。

我們自定的index值被叫做索引下標,沒有設置index值時會有一個默認的值叫做位置下標。

from pandas import Series

mp=['001','002','003','004','005','006']
name=['亞瑟', '後裔','小喬','哪吒' ,'虞姬','王昭君']
se = Series(data=name,index=mp)

# 使用索引獲取單個數值
print(se[0])
print('-'*20)
# 使用索引獲取多個不連續的數值
print('位置下標')
print(se[[1,3,5]])
print('-'*20)
# 使用索引獲取多個連續的數值
print('位置切片')
print(se[3:5])

# 輸出結果:
亞瑟
--------------------
位置下標
002     後裔
004     哪吒
006    王昭君
dtype: object
--------------------
位置切片
004    哪吒
005    虞姬
dtype: object

需要注意的是:當使用默認索引進行切片時,不會取最後一個值;而使用自定義索引,則會取到最後一個值。

和Python其它數據結構類似,我們可以很方便的利用循環來遍歷Series。

  • 我們可以直接遍歷Series的值。
# 遍歷並拿到data數據
for value in series:
	print(value)
  • 通過keys(),遍歷Series的索引。
# 遍歷並拿到index數據
for value in series.keys():
	print(value)
  • 也可以通過items(),遍歷Series的每對索引和數據
# 遍歷並拿到每對索引和數據
for value in series.items()
	print(value)
# 或者
for key,value in series.items():
	print(key,value)

看如下的示例:

from pandas import Series

mp=['001','002','003','004','005','006']
name=['亞瑟', '後裔','小喬','哪吒' ,'虞姬','王昭君']
se = Series(data=name,index=mp)

# 獲取數據
for data in se:
    print(data)
print('-'*20)
# 獲取索引
for value in se.keys():
    print(value)
print('-'*20)
# 同時獲取數據與索引
for i in se.items():
    print(i)
print('~'*20)
for j,k in se.items():
    print(j,k)

# 輸出結果:
亞瑟
後裔
小喬
哪吒
虞姬
王昭君
--------------------
001
002
003
004
005
006
--------------------
('001', '亞瑟')
('002', '後裔')
('003', '小喬')
('004', '哪吒')
('005', '虞姬')
('006', '王昭君')
~~~~~~~~~~~~~~~~~~~~
001 亞瑟
002 後裔
003 小喬
004 哪吒
005 虞姬
006 王昭君

六. DataFrame數據的獲取與遍歷

DataFrame裏的數據是按照行和列來進行排列,現在我們一起來看下如何對DataFrame的數據按照行或者列進行選擇、遍歷以及修改。

首先數據的維度是一維還是二維的我們可以使用ndim查看,數據的行數和列數shape,以及行列的索引值index、columns。

import pandas as pd

# 創建字典存儲數據
dic = {'姓名': ['星宿老怪', '李莫愁', '喬峯', '段譽', '虛竹', '阿紫', '逍遙子'],
       '年齡': ['80', '36', '27', '25', '26', '22', '98'],
       '角色': ['配角', '配角', '主角', '主角', '主角', '配角', '老配角'],
       '絕招': ['化功大法', '鋼鐵浮塵', '降龍十八掌', '六脈神劍', '泡妞大法', '毒力無敵', '眼神就是我的武器'],
       '口號': ['星宿老仙,法力無邊', '哼,楊過和小龍女不能在一起', '小子,看我降龍十八掌', '姐姐,我有六脈神劍哦', '夢姑,你在哪裏啊?我好想你', '姐夫,我要和你在一起,我要和你睏覺',
              '哈哈,你的圍棋功力太弱了']}
# 索引列表
index_list = ['001', '002', '003', '004', '005', '006', '007']
# 創建DataFrame
df = pd.DataFrame(data=dic, index=index_list)

# 打印DataFrame
print(df)
print('-' * 20)
# 獲取數據的維度
print(df.ndim)
print('-' * 20)
# 獲取行數和列數
print(df.shape)
print('-' * 20)
# 獲取行索引
print(df.index.tolist())
print('-' * 20)
# 獲取列索引
print(df.columns.tolist())

# 輸出結果:
       姓名  年齡   角色        絕招                 口號
001  星宿老怪  80   配角      化功大法          星宿老仙,法力無邊
002   李莫愁  36   配角      鋼鐵浮塵      哼,楊過和小龍女不能在一起
003    喬峯  27   主角     降龍十八掌         小子,看我降龍十八掌
004    段譽  25   主角      六脈神劍         姐姐,我有六脈神劍哦
005    虛竹  26   主角      泡妞大法      夢姑,你在哪裏啊?我好想你
006    阿紫  22   配角      毒力無敵  姐夫,我要和你在一起,我要和你睏覺
007   逍遙子  98  老配角  眼神就是我的武器       哈哈,你的圍棋功力太弱了
--------------------
2
--------------------
(7, 5)
--------------------
['001', '002', '003', '004', '005', '006', '007']
--------------------
['姓名', '年齡', '角色', '絕招', '口號']

需要注意的是,如果我們數據量是10G,像這種數據量比較大並且我們想看數據的具體情況的時候,這些屬性就不夠用了,如果直接打印df有比較耗時,所以我們可以只獲取前幾行或者後幾行,瞭解數據的構成即可。

可以使用head()和tail()方法取出前幾行或後幾行的數據,兩個方法都有默認值,默認值是5,如果數據不夠5個會將全部數據拿出來。當然也可以自己設置。

import pandas as pd

# 創建字典存儲數據
dic = {'姓名': ['星宿老怪', '李莫愁', '喬峯', '段譽', '虛竹', '阿紫', '逍遙子'],
       '年齡': ['80', '36', '27', '25', '26', '22', '98'],
       '角色': ['配角', '配角', '主角', '主角', '主角', '配角', '老配角'],
       '絕招': ['化功大法', '鋼鐵浮塵', '降龍十八掌', '六脈神劍', '泡妞大法', '毒力無敵', '眼神就是我的武器'],
       '口號': ['星宿老仙,法力無邊', '哼,楊過和小龍女不能在一起', '小子,看我降龍十八掌', '姐姐,我有六脈神劍哦', '夢姑,你在哪裏啊?我好想你', '姐夫,我要和你在一起,我要和你睏覺',
              '哈哈,你的圍棋公里太弱了']}
# 索引列表
index_list = ['001', '002', '003', '004', '005', '006', '007']
# 創建DataFrame
df = pd.DataFrame(data=dic, index=index_list)

# 獲取前3條數據
print(df.head(3))
print('-'*20)
# 獲取最後3條數據
print(df.tail(3))

# 輸出結果:
       姓名  年齡  角色     絕招             口號
001  星宿老怪  80  配角   化功大法      星宿老仙,法力無邊
002   李莫愁  36  配角   鋼鐵浮塵  哼,楊過和小龍女不能在一起
003    喬峯  27  主角  降龍十八掌     小子,看我降龍十八掌
--------------------
      姓名  年齡   角色        絕招                 口號
005   虛竹  26   主角      泡妞大法      夢姑,你在哪裏啊?我好想你
006   阿紫  22   配角      毒力無敵  姐夫,我要和你在一起,我要和你睏覺
007  逍遙子  98  老配角  眼神就是我的武器       哈哈,你的圍棋功力太弱了

獲取行數據

瞭解數據了,我們就可以修煉下一個招式–獲取行數據了。

1. 通過位置索引直接獲取
# 通過位置索引切片獲取一行
print(df[0:1])
# 通過位置索引切片獲取多行
print(df[1:3])
# 獲取多行裏面的某幾列
print(df[1:3][['name','age']])
# 獲取DataFrame的列
print(df['name'])
# 如果獲取多個列
print(df[['name','age']])

看如下示例:

import pandas as pd

# 創建字典存儲數據
dic = {'姓名': ['星宿老怪', '李莫愁', '喬峯', '段譽', '虛竹', '阿紫', '逍遙子'],
       '年齡': ['80', '36', '27', '25', '26', '22', '98'],
       '角色': ['配角', '配角', '主角', '主角', '主角', '配角', '老配角'],
       '絕招': ['化功大法', '鋼鐵浮塵', '降龍十八掌', '六脈神劍', '泡妞大法', '毒力無敵', '眼神就是我的武器'],
       '口號': ['星宿老仙,法力無邊', '哼,楊過和小龍女不能在一起', '小子,看我降龍十八掌', '姐姐,我有六脈神劍哦', '夢姑,你在哪裏啊?我好想你', '姐夫,我要和你在一起,我要和你睏覺',
              '哈哈,你的圍棋功力太弱了']}
# 索引列表
index_list = ['001', '002', '003', '004', '005', '006', '007']
# 創建DataFrame
df = pd.DataFrame(data=dic, index=index_list)

# 通過位置索引獲取一行數據
print(df[0:1])
print('-'*20)
# 通過位置索引獲取多行數據
print(df[0:5])
print('-'*20)
# 獲取某幾行的某幾列數據
print(df[1:3][['姓名','絕招']])
print('-'*20)
# 獲取某列數據
print(df['姓名'])
print('~'*20)
print(df[['姓名']])
print('-'*20)
# 獲取多列數據
print(df[['姓名','口號']])

# 輸出結果:
       姓名  年齡  角色    絕招         口號
001  星宿老怪  80  配角  化功大法  星宿老仙,法力無邊
--------------------
       姓名  年齡  角色     絕招             口號
001  星宿老怪  80  配角   化功大法      星宿老仙,法力無邊
002   李莫愁  36  配角   鋼鐵浮塵  哼,楊過和小龍女不能在一起
003    喬峯  27  主角  降龍十八掌     小子,看我降龍十八掌
004    段譽  25  主角   六脈神劍     姐姐,我有六脈神劍哦
005    虛竹  26  主角   泡妞大法  夢姑,你在哪裏啊?我好想你
--------------------
      姓名     絕招
002  李莫愁   鋼鐵浮塵
003   喬峯  降龍十八掌
--------------------
001    星宿老怪
002     李莫愁
003      喬峯
004      段譽
005      虛竹
006      阿紫
007     逍遙子
Name: 姓名, dtype: object
~~~~~~~~~~~~~~~~~~~~
       姓名
001  星宿老怪
002   李莫愁
003    喬峯
004    段譽
005    虛竹
006    阿紫
007   逍遙子
--------------------
       姓名                 口號
001  星宿老怪          星宿老仙,法力無邊
002   李莫愁      哼,楊過和小龍女不能在一起
003    喬峯         小子,看我降龍十八掌
004    段譽         姐姐,我有六脈神劍哦
005    虛竹      夢姑,你在哪裏啊?我好想你
006    阿紫  姐夫,我要和你在一起,我要和你睏覺
007   逍遙子       哈哈,你的圍棋功力太弱了
  • df[]不支持直接輸入標籤索引獲取行數據,例如:df[‘001’],只能通過df[0:1]這種方式
  • 這種方式可以獲取一列數據,列如:df[‘name’]或者df[[‘name’]]
  • 如果想獲取多行裏面的某幾列可寫成:df[行][列],例如:df[1:3][[‘name’,‘age’]],將行索引值放到同一個列表中,再將列表放到第二個方括號中
  • 這種方式只能獲取連續多行的數據,不能間隔獲取行數據
2. 通過行位置索引篩選iloc[]
# 取一行
print(df.iloc[1])
# 取連續多行
print(df.iloc[0:2])
# 取間斷的多行
print(df.iloc[[0,2],:])
# 取某一列
print(df.iloc[:,1])
# 某一個值
print(df.iloc[1,0])

看如下示例:

import pandas as pd

# 創建字典存儲數據
dic = {'姓名': ['星宿老怪', '李莫愁', '喬峯', '段譽', '虛竹', '阿紫', '逍遙子'],
       '年齡': ['80', '36', '27', '25', '26', '22', '98'],
       '角色': ['配角', '配角', '主角', '主角', '主角', '配角', '老配角'],
       '絕招': ['化功大法', '鋼鐵浮塵', '降龍十八掌', '六脈神劍', '泡妞大法', '毒力無敵', '眼神就是我的武器'],
       '口號': ['星宿老仙,法力無邊', '哼,楊過和小龍女不能在一起', '小子,看我降龍十八掌', '姐姐,我有六脈神劍哦', '夢姑,你在哪裏啊?我好想你', '姐夫,我要和你在一起,我要和你睏覺',
              '哈哈,你的圍棋功力太弱了']}
# 索引列表
index_list = ['001', '002', '003', '004', '005', '006', '007']
# 創建DataFrame
df = pd.DataFrame(data=dic, index=index_list)

# 獲取一行數據
print(df.iloc[[1]])
print('-'*20)
# 獲取連續多行的數據
print(df.iloc[0:3])
print('-'*20)
# 獲取間斷的多行數據
print(df.iloc[[1,3,4]])
print('-'*20)
# 獲取某一列的數據
print(df.iloc[:,[2]])
print('-'*20)
# 獲取連續多列的數據
print(df.iloc[:,1:3])
print("-"*20)
# 獲取間隔多列的數據
print(df.iloc[:,[1,3,4]])
print("-"*20)
# 獲取間隔的多行多列的數據
print(df.iloc[[0,2,3],[1,3,4]])
print('-'*20)
# 獲取某個數值
print(df.iloc[[1],[0]])
# 輸出結果:
      姓名  年齡  角色    絕招             口號
002  李莫愁  36  配角  鋼鐵浮塵  哼,楊過和小龍女不能在一起
--------------------
       姓名  年齡  角色     絕招             口號
001  星宿老怪  80  配角   化功大法      星宿老仙,法力無邊
002   李莫愁  36  配角   鋼鐵浮塵  哼,楊過和小龍女不能在一起
003    喬峯  27  主角  降龍十八掌     小子,看我降龍十八掌
--------------------
      姓名  年齡  角色    絕招             口號
002  李莫愁  36  配角  鋼鐵浮塵  哼,楊過和小龍女不能在一起
004   段譽  25  主角  六脈神劍     姐姐,我有六脈神劍哦
005   虛竹  26  主角  泡妞大法  夢姑,你在哪裏啊?我好想你
--------------------
      角色
001   配角
002   配角
003   主角
004   主角
005   主角
006   配角
007  老配角
--------------------
     年齡   角色
001  80   配角
002  36   配角
003  27   主角
004  25   主角
005  26   主角
006  22   配角
007  98  老配角
--------------------
     年齡        絕招                 口號
001  80      化功大法          星宿老仙,法力無邊
002  36      鋼鐵浮塵      哼,楊過和小龍女不能在一起
003  27     降龍十八掌         小子,看我降龍十八掌
004  25      六脈神劍         姐姐,我有六脈神劍哦
005  26      泡妞大法      夢姑,你在哪裏啊?我好想你
006  22      毒力無敵  姐夫,我要和你在一起,我要和你睏覺
007  98  眼神就是我的武器       哈哈,你的圍棋功力太弱了
--------------------
     年齡     絕招          口號
001  80   化功大法   星宿老仙,法力無邊
003  27  降龍十八掌  小子,看我降龍十八掌
004  25   六脈神劍  姐姐,我有六脈神劍哦
--------------------
      姓名
002  李莫愁
3. 通過行標籤索引篩選loc[]
import pandas as pd

# 創建字典存儲數據
dic = {'姓名': ['星宿老怪', '李莫愁', '喬峯', '段譽', '虛竹', '阿紫', '逍遙子'],
       '年齡': ['80', '36', '27', '25', '26', '22', '98'],
       '角色': ['配角', '配角', '主角', '主角', '主角', '配角', '老配角'],
       '絕招': ['化功大法', '鋼鐵浮塵', '降龍十八掌', '六脈神劍', '泡妞大法', '毒力無敵', '眼神就是我的武器'],
       '口號': ['星宿老仙,法力無邊', '哼,楊過和小龍女不能在一起', '小子,看我降龍十八掌', '姐姐,我有六脈神劍哦', '夢姑,你在哪裏啊?我好想你', '姐夫,我要和你在一起,我要和你睏覺',
              '哈哈,你的圍棋功力太弱了']}
# 索引列表
index_list = ['001', '002', '003', '004', '005', '006', '007']
# 創建DataFrame
df = pd.DataFrame(data=dic, index=index_list)

# 獲取某一行的數據
print(df.loc[['001']])
print('-'*20)
# 獲取某一行某一列的數據
print(df.loc[['001'],['姓名']])
print('-'*20)
# 獲取某一行多列的數據
print(df.loc[['001'],['姓名','絕招']])
print('-'*20)
# 獲取間隔的多行多列的數據
print(df.loc[['001','003'],['姓名','絕招','口號']])
print('-'*20)
# 獲取連續多行多列的數據
print(df.loc['001':'003','姓名':'口號'])

# 輸出結果:
       姓名  年齡  角色    絕招         口號
001  星宿老怪  80  配角  化功大法  星宿老仙,法力無邊
--------------------
       姓名
001  星宿老怪
--------------------
       姓名    絕招
001  星宿老怪  化功大法
--------------------
       姓名     絕招          口號
001  星宿老怪   化功大法   星宿老仙,法力無邊
003    喬峯  降龍十八掌  小子,看我降龍十八掌
--------------------
       姓名  年齡  角色     絕招             口號
001  星宿老怪  80  配角   化功大法      星宿老仙,法力無邊
002   李莫愁  36  配角   鋼鐵浮塵  哼,楊過和小龍女不能在一起
003    喬峯  27  主角  降龍十八掌     小子,看我降龍十八掌
import pandas as pd

# 創建字典存儲數據
dic = {'姓名': ['星宿老怪', '李莫愁', '喬峯', '段譽', '虛竹', '阿紫', '逍遙子'],
       '年齡': ['80', '36', '27', '25', '26', '22', '98'],
       '角色': ['配角', '配角', '主角', '主角', '主角', '配角', '老配角'],
       '絕招': ['化功大法', '鋼鐵浮塵', '降龍十八掌', '六脈神劍', '泡妞大法', '毒力無敵', '眼神就是我的武器'],
       '口號': ['星宿老仙,法力無邊', '哼,楊過和小龍女不能在一起', '小子,看我降龍十八掌', '姐姐,我有六脈神劍哦', '夢姑,你在哪裏啊?我好想你', '姐夫,我要和你在一起,我要和你睏覺',
              '哈哈,你的圍棋功力太弱了']}
# 索引列表
index_list = ['001', '002', '003', '004', '005', '006', '007']
# 創建DataFrame
df = pd.DataFrame(data=dic, index=index_list)

# 獲取某一行所有列的數據
print(df.loc['001',:])
print('-'*20)
# # 獲取某一行某一列的數據
print(df.loc['001','姓名'])
print('-'*20)
# # 獲取某一行多列的數據
print(df.loc['001',['姓名','絕招']])

# 輸出結果:
姓名         星宿老怪
年齡           80
角色           配角
絕招         化功大法
口號    星宿老仙,法力無邊
Name: 001, dtype: object
--------------------
星宿老怪
--------------------
姓名    星宿老怪
絕招    化功大法
Name: 001, dtype: object

注意

  • df.loc[] 通過標籤索引獲取行數據,它的語法結構是這樣的:df.loc[[行],[列]],方括號中用逗號分隔,左側是行、右側是列
  • 如果行或者列使用切片的時候,要把方括號去掉,列df.loc[‘001’:‘003’,‘姓名’:‘絕招’]。

需要注意的是:loc和iloc的切片操作在是否包含切片終點的數據有差異。

  • loc[‘001’:‘003’]的結果中包含行索引003對應的行。
  • iloc[0:2] 結果中不包含序號爲2的數據,切片終點對應的數據不在篩選結果中。

遍歷DataFrame

  • iterrows(): 按行遍歷。將DataFrame的每一行轉化爲(index, Series)對。index爲行索引值,Series爲該行對應的數據
for index,row_data in df.iterrows():
    print(index,row_data)
  • iteritems():按列遍歷,將DataFrame的每一列轉化爲(column, Series)對。column爲列索引的值,Series爲該列對應的數據。
for col,col_data in df.iteritems():
    print(col)

示例如下:

import pandas as pd

# 創建字典存儲數據
dic = {'姓名': ['星宿老怪', '李莫愁', '喬峯', '段譽', '虛竹', '阿紫', '逍遙子'],
       '年齡': ['80', '36', '27', '25', '26', '22', '98'],
       '角色': ['配角', '配角', '主角', '主角', '主角', '配角', '老配角'],
       '絕招': ['化功大法', '鋼鐵浮塵', '降龍十八掌', '六脈神劍', '泡妞大法', '毒力無敵', '眼神就是我的武器'],
       '口號': ['星宿老仙,法力無邊', '哼,楊過和小龍女不能在一起', '小子,看我降龍十八掌', '姐姐,我有六脈神劍哦', '夢姑,你在哪裏啊?我好想你', '姐夫,我要和你在一起,我要和你睏覺',
              '哈哈,你的圍棋功力太弱了']}
# 索引列表
index_list = ['001', '002', '003', '004', '005', '006', '007']
# 創建DataFrame
df = pd.DataFrame(data=dic, index=index_list)

# 按行遍歷
for index,row_data in df.iterrows():
    print(index,row_data)
print('-'*20)
# 按列遍歷
for co,col_data in df.iteritems():
    print(co,col_data)

# 輸出結果:
001 姓名         星宿老怪
年齡           80
角色           配角
絕招         化功大法
口號    星宿老仙,法力無邊
Name: 001, dtype: object
002 姓名              李莫愁
年齡               36
角色               配角
絕招             鋼鐵浮塵
口號    哼,楊過和小龍女不能在一起
Name: 002, dtype: object
003 姓名            喬峯
年齡            27
角色            主角
絕招         降龍十八掌
口號    小子,看我降龍十八掌
Name: 003, dtype: object
004 姓名            段譽
年齡            25
角色            主角
絕招          六脈神劍
口號    姐姐,我有六脈神劍哦
Name: 004, dtype: object
005 姓名               虛竹
年齡               26
角色               主角
絕招             泡妞大法
口號    夢姑,你在哪裏啊?我好想你
Name: 005, dtype: object
006 姓名                   阿紫
年齡                   22
角色                   配角
絕招                 毒力無敵
口號    姐夫,我要和你在一起,我要和你睏覺
Name: 006, dtype: object
007 姓名             逍遙子
年齡              98
角色             老配角
絕招        眼神就是我的武器
口號    哈哈,你的圍棋功力太弱了
Name: 007, dtype: object
--------------------
姓名 001    星宿老怪
002     李莫愁
003      喬峯
004      段譽
005      虛竹
006      阿紫
007     逍遙子
Name: 姓名, dtype: object
年齡 001    80
002    36
003    27
004    25
005    26
006    22
007    98
Name: 年齡, dtype: object
角色 001     配角
002     配角
003     主角
004     主角
005     主角
006     配角
007    老配角
Name: 角色, dtype: object
絕招 001        化功大法
002        鋼鐵浮塵
003       降龍十八掌
004        六脈神劍
005        泡妞大法
006        毒力無敵
007    眼神就是我的武器
Name: 絕招, dtype: object
口號 001            星宿老仙,法力無邊
002        哼,楊過和小龍女不能在一起
003           小子,看我降龍十八掌
004           姐姐,我有六脈神劍哦
005        夢姑,你在哪裏啊?我好想你
006    姐夫,我要和你在一起,我要和你睏覺
007         哈哈,你的圍棋功力太弱了
Name: 口號, dtype: object

六. 總結

Series常用屬性和方法:

  • 獲取數據的值values
  • 獲取數據的索引index
  • 獲取每對索引和值items()
  • 索引下標:自定義的Index
  • 位置下標:默認的Index
  • 切片:連續se['001:'004];不連續se[[‘001’,‘004’]]
  • 數據遍歷:使用for…in values、keys()、items()獲取數據、索引和每對索引、數據

DataFrame的數據獲取與遍歷:

  • 獲取數據的行數和列數shape
  • 獲取數據的前幾行head()和後幾行tail()
  • df[]不能直接輸入標籤索引獲取數據
  • 獲取多行裏面的某幾列:df[[行][列]]
  • df.loc[]標籤索引獲取行數據
  • df.iloc[]位置索引獲取行數據
  • 數據遍歷:for…in iterrows()按行遍歷;for…in iteritems按列遍歷

五. 練習

  1. 復仇者聯盟
from pandas import Series,DataFrame

# 第一種方法,字典存儲天團信息
dic = {'姓名':['小羅伯特·唐尼','克里斯·埃文斯','斯嘉麗·約翰遜','克里斯·海姆斯沃斯'],
       '角色':['鋼鐵俠','美國隊長','黑寡婦','雷神'],
       '武器':['鋼鐵戰衣','盾牌','寡婦蟄','雷神之錘'],
       '語錄':['和平,我熱愛和平','最好的武器是重新開始','嘿,大兄弟,太陽下山了','要用知識打敗無知']}

# 創建dataframe
df = DataFrame(data=dic)

print(df)

# 第二種方法,使用列表存儲天團信息
list = [['小羅伯特·唐尼', '鋼鐵俠', '鋼鐵戰衣', '和平,我熱愛和平'],
        ['克里斯·埃文斯', '美國隊長', '盾牌', '最好的武器是重新開始'],
        ['斯嘉麗·約翰遜', '黑寡婦', '寡婦蟄', '嘿,大兄弟,太陽下山了'],
        ['克里斯·海姆斯沃斯', '雷神', '雷神之錘', '要用知識打敗無知']]
# 創建dataframe
df = DataFrame(data=list,index=[0,1,2,3],columns=['姓名','角色','武器','語錄'])
print(df)

 # 輸出結果:
           姓名    角色    武器           語錄
0    小羅伯特·唐尼   鋼鐵俠  鋼鐵戰衣     和平,我熱愛和平
1    克里斯·埃文斯  美國隊長    盾牌   最好的武器是重新開始
2    斯嘉麗·約翰遜   黑寡婦   寡婦蟄  嘿,大兄弟,太陽下山了
3  克里斯·海姆斯沃斯    雷神  雷神之錘     要用知識打敗無知
  1. 記錄備忘錄信息
from pandas import Series,DataFrame

# 創建索引
index_list = ['NO1','NO2','NO3']
# 創建字典
dic = {'姓名':Series(['娜娜','小紅','依依'],index=index_list),
       '類型':Series(['可愛單純','風騷火辣','性感高冷'],index=index_list),
       '愛好':Series(['逛街、電影、愛喫甜','喝酒、蹦迪、愛喫辣','看書、烘焙、愛喫酸'],index=index_list),
       '時間':Series(['2019-2-14去蹦迪','2019-2-16去喫飯','2019-2-18去死的時候'],index=index_list)}

df = DataFrame(dic)
print(df)

# 第二種方法,創建列表,存儲信息
se1 = ['娜娜','可愛單純','逛街、電影、愛喫甜','2019-2-14去蹦迪']
se2 = ['小紅','風騷火辣','喝酒、蹦迪、愛喫辣','2019-2-16去喫飯']
se3 = ['依依','性感高冷','看書、烘焙、愛喫酸','2019-2-18去死的時候']

series_list = [se1,se2,se3]
# 創建Dataframe
df = DataFrame(data=series_list,index=['NO1','NO2','NO3'],columns=['姓名','類型','愛好','時間'])
print(df)

# 輸出結果:
     姓名    類型         愛好              時間
NO1  娜娜  可愛單純  逛街、電影、愛喫甜    2019-2-14去蹦迪
NO2  小紅  風騷火辣  喝酒、蹦迪、愛喫辣    2019-2-16去喫飯
NO3  依依  性感高冷  看書、烘焙、愛喫酸  2019-2-18去死的時候
  1. 根據公司的員工信息登記表數據,獲取相關信息:
    1. 獲取工號爲003~007的所有員工信息;
    2. 獲取所有員工的年齡和工資信息;
    3. 查看一個你感興趣員工的婚姻狀況。
from pandas import Series,DataFrame
index_list = ['001','002','003','004','005','006','007','008','009','010']
name_list = ['李白','王昭君','諸葛亮','狄仁傑','孫尚香','妲己','周瑜','張飛','王昭君','大喬']
age_list = [25,28,27,25,30,29,25,32,28,26]
salary_list = ['10k','12.5','20k','14k','12k','17k','18k','21k','22k','21.5k']
marital_list = ['NO','NO','YES','YES','NO','NO','NO','YES','NO','YES']
dic={
    '姓名': Series(data=name_list,index=index_list),
    '年齡': Series(data=age_list,index=index_list),
    '薪資': Series(data=salary_list,index=index_list),
    '婚姻狀況': Series(data=marital_list,index=index_list)
    }
df = DataFrame(data=dic,index=index_list)
# 獲取工號003-007的所有員工信息
print(df.loc['003':'007'])
print('-'*20)
# 獲取所有員工的年齡和工資信息
print(df.loc[:,['年齡','薪資']])
print('-'*20)
# 隨意查看某個感興趣的員工的婚姻狀況
print(df.loc[['002'],['姓名','婚姻狀況']])

# 輸出結果:
      姓名  年齡   薪資 婚姻狀況
003  諸葛亮  27  20k  YES
004  狄仁傑  25  14k  YES
005  孫尚香  30  12k   NO
006   妲己  29  17k   NO
007   周瑜  25  18k   NO
--------------------
     年齡     薪資
001  25    10k
002  28   12.5
003  27    20k
004  25    14k
005  30    12k
006  29    17k
007  25    18k
008  32    21k
009  28    22k
010  26  21.5k
--------------------
      姓名 婚姻狀況
002  王昭君   NO

  1. 根據練習3的信息,用三種方法遍歷獲取所有員工的薪資信息;獲取最高薪水值
from pandas import Series,DataFrame
index_list = ['001','002','003','004','005','006','007','008','009','010']
name_list = ['李白','王昭君','諸葛亮','狄仁傑','孫尚香','妲己','周瑜','張飛','王昭君','大喬']
age_list = [25,28,27,25,30,29,25,32,28,26]
salary_list = ['10k','12.5','20k','14k','12k','17k','18k','21k','22k','21.5k']
marital_list = ['NO','NO','YES','YES','NO','NO','NO','YES','NO','YES']
dic={
    '姓名': Series(data=name_list,index=index_list),
    '年齡': Series(data=age_list,index=index_list),
    '薪資': Series(data=salary_list,index=index_list),
    '婚姻狀況': Series(data=marital_list,index=index_list)
    }
df=DataFrame(data=dic,index=index_list)

# 第一種方法,df[]
list2 = []
for value in df['薪資']:
    print(value)
    # 獲取最大值
    list2.append(value)
print(max(list2))
print('-'*20)
# 第二種方法,標籤索引
for value in df.loc[:,'薪資']:
    print(value)
print('-'*20)
# 第三種方法,位置索引
for value in df.iloc[:,2]:
    print(value)
print('-'*20)
# 第四種方法,遍歷行
for index,row_data in df.iterrows():
    print(row_data['薪資'])
print('-'*20)
# 第五種方法,遍歷列
for co,col_data in df.iteritems():
    if co == '薪資':
        print(col_data)
print('-'*20)
# 獲取最大值
list1 = []
for co,col_data in df.iteritems():
    if co =='薪資':
        for salary in col_data:
            list1.append(salary)
print(max(list1))


# 輸出結果:
10k
12.5
20k
14k
12k
17k
18k
21k
22k
21.5k
22k
--------------------
10k
12.5
20k
14k
12k
17k
18k
21k
22k
21.5k
--------------------
10k
12.5
20k
14k
12k
17k
18k
21k
22k
21.5k
--------------------
10k
12.5
20k
14k
12k
17k
18k
21k
22k
21.5k
--------------------
001      10k
002     12.5
003      20k
004      14k
005      12k
006      17k
007      18k
008      21k
009      22k
010    21.5k
Name: 薪資, dtype: object
--------------------
22k
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章