數據分析如下所示共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按列遍歷
五. 練習
- 復仇者聯盟
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 克里斯·海姆斯沃斯 雷神 雷神之錘 要用知識打敗無知
- 記錄備忘錄信息
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去死的時候
- 根據公司的員工信息登記表數據,獲取相關信息:
- 獲取工號爲003~007的所有員工信息;
- 獲取所有員工的年齡和工資信息;
- 查看一個你感興趣員工的婚姻狀況。
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
- 根據練習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