天天看點

Python之Pandas庫一 Pandas資料結構二 Series三 DataFrame四 Pandas常用操作五 處理缺失資料六 階層化索引七 Pandas制圖八Matplotlib

Pandas: 資料分析利器。是Python的一個資料分析包,内置了很多了圖表。

一 Pandas資料結構

1.1 Series一種類似于一維數組的對象,它是由一組資料以及一組與之相關的資料标簽組成。僅由一組資料即可産生簡單的Series

1.2 DataFrame: 一個表格型的資料結構,含有一組有序的序列,每一列可以是不同的值類型,DataFrame既有行索引也有列索引,可以被看做是由Series組成的字典

二 Series

2.1 通過一維數組建立Series

arr = np.array([1,2,3,4,5])

ser1 = Series(arr)

索引:0    value:1

索引:1    value:2

索引:2    value:3

索引:3    value:4

索引:4    value:5

dtype: int32

ser1.index
RangeIndex(start=0, stop=5, step=1)

ser1.values
[1 2 3 4 5]      

索引預設是[0~N-1],我們可以通過index屬性來指定索引值

scores = np.array([134,147,125,252])
series = Series(scores,index=['國文','數學','英語','綜合科'])
print(series.index)      

2.2 通過字典方式建立Series

Series可以看做是一個映射,是以可以通過字典來建立Ser

map = {'x':112.5,'y':345,'z':231,'u':999}
series = Series(map)      

2.3 Series應用Numpy數組運算

# 通過索引取值

Series[0],或者series['x']

# Numpy中數組運算在Series中都保留,并且Series進行數組運算的時候,索引和值之間的映射關系不會變

ser1 = Series([1,3,5,7,9],index=['A','B','C','D','E'])
ser2 = Series([2,4,6,8,10],index=['F','G','H','G','K'])

ser1[ser1 > 2]
ser1[ser1.index == 'A']
ser1 / 2
np.square(ser1)
np.add(ser1,ser2)      

2.4 Series缺失值檢測

在Pandas中,NaN表示不是一個缺失的值或者NA值

Isnull & notnull函數可以用于Series缺失值檢測,傳回的是一個布爾類型的Series

ser1 = Series([1,3,5,7,9],index=['A','B','C','D','E'])
newIndex = ['A','B','C','D','E','F','G']
ser2 = Series(ser1,index=newIndex)
res1 = pd.isnull(ser2)
res2 = pd.notnull(ser2)      
ser2[pd.isnull(ser2)]
ser2[pd.notnull(ser2)]      
print(ser2)
A    1.0
B    3.0
C    5.0
D    7.0
E    9.0
F    NaN
G    NaN
print(res1)
A    False
B    False
C    False
D    False
E    False
F     True
G     True
print(res2)
A     True
B     True
C     True
D     True
E     True
F    False
G    False      

2.5 Series自動對齊

不同Series之間進行算術運算會對齊不同索引的資料:

num = Series([23,45,67,89],index=['p3','p1','p2','p5'])
price = Series([9.98,2.34,4.56,5.67,8.78],index=['p1','p2','p3','p4','p5'])
total = num * price
print(total)      

p1    449.10

p2    156.78

p3    104.88

p4       NaN

p5    781.42

2.6 Series及其索引的name屬性

Series對象本身及其索引都有一個name屬性,可以指派設定

num = Series([23,45,67,89],index=['p3','p1','p2','p5'])
num.name = '産品數量'
num.index.name = '産品數量索引'
print(num)      

産品數量索引

p3    23

p1    45

p2    67

p5    89

Name: 産品數量, dtype: int64

三 DataFrame

3.1 通過二維數組建立DataFrame

arr = np.array(
    [
        ['Tom','Merry','John','Nicky'],
        [76,98,100,88],
        ['Helln','Mary','Adulgt','Colo'],
        [89,68,90,78]
    ]
)      
df = DataFrame(arr)
print(df)      

3.2 通過字典建立DataFrame

d = {
    'Tom':[120,137,115,247],
    'Merry':[111,142,125,232],
    'John':[125,147,105,240],
    'Nicky':[130,137,125,260]
}

df = DataFrame(d)
print(df)      

3.3 DataFrame的行索引和列索引

我們可以通過index屬性設定航索引,通過columns設定列索引

data = {
    'Tom':[120,137,115,247],
    'Merry':[111,142,125,232],
    'John':[125,147,105,240],
    'Nicky':[130,137,125,260]
}

df = DataFrame(data,index=['國文','數學','英語','理綜'])
print(df.index)
Index(['國文', '數學', '英語', '理綜'], dtype='object')
print(df.columns)
Index(['John', 'Merry', 'Nicky', 'Tom'], dtype='object')
print(df.values)
[[125 111 130 120]
 [147 142 137 137]
 [105 125 125 115]
 [240 232 260 247]]      

3.4 索引對象

索引對象負責管理軸标簽和其他中繼資料,通過索引可以從Series,DataFrame中取值或對某個位置的值重新指派

# 通過索引從Series中取值

s = Series([1,2,3,4,5],index=['2001','2002','2003','2004'])
s['2001']
1
s['2001':'2003']
2001    1
2002    2
2003    3
s['2003':]
2003    3
2004    4
2005    5

s[:'2003']
2001    1
2002    2
2003    3      

# 通過索引從DataFrame中取值

data = {
    'Tom':[120,137,115,247],
    'Merry':[111,142,125,232],
    'John':[125,147,105,240],
    'Nicky':[130,137,125,260]
}

df = DataFrame(data,index=['國文','數學','英語','理綜'])
# 取出某一列的值
df['Nicky']
# 取出某一列的值某一行的值
df['Nicky']['理綜']
# 取出某一行的值
df.ix[0]
# 取出從第一行到第二行的值
df.ix[0:2]      

四 Pandas常用操作

4.1 重新索引

s = Series([201,45,568,124,88],index=[0,1,2,3,4])
# Series重新索引
s.index=[16,3,5,20,10]
print('重新索引',s)

data = {
    'Tom':[120,137,115,247],
    'Merry':[111,142,125,232],
    'John':[125,147,105,240],
    'Nicky':[130,137,125,260]
}

df = DataFrame(data,index=['國文','數學','英語','理綜'])
# DataFrame重新索引
df.index = ['language','math','english','mord']
print(df)      

4.2 丢棄指定軸上的項

s = Series([201,45,568,124,88],index=[0,1,2,3,4])
# Series重新索引
s.index=[16,3,5,20,10]
print('重新索引',s)

# 丢棄指定軸上的項
s[5] = np.NaN
print('丢棄指定軸上的項',s)
data = {
    'Tom':[120,137,115,247],
    'Merry':[111,142,125,232],
    'John':[125,147,105,240],
    'Nicky':[130,137,125,260]
}

df = DataFrame(data,index=['國文','數學','英語','理綜'])
# DataFrame重新索引
df.index = ['language','math','english','mord']
# 丢棄指定軸上的項
df['Tom'] = np.NaN
print('丢棄指定軸上的項',df)      

丢棄指定軸上的項 16    201.0

3      45.0

5       NaN

20    124.0

10     88.0

dtype: float64

丢棄指定軸上的項           John Merry  Nicky  Tom

language  125    111    130 NaN

math      147    142    137 NaN

english   105    125    125 NaN

mord      240    232    260 NaN

4.3 擷取前幾行

print(df.head(2))      

4.4 資料的快速統計

# 資料的快速統計
print(df.describe())      

4.5 通過标簽定位和設定值

df.loc['數學','Nicky']      
137      
df.loc[['數學','國文'],['Nicky','Tom']]      
Nicky Tom
數學 137 137 
國文 130 120       
df.loc['數學','Nicky'] = 148      

4.6 排序和排名

# 按照索引值排序,axis=0表示橫軸,axis=1表示縱軸,ascending指定是否升序
df.sort_index(axis=0,ascending=True)      
# 按照某一列的值排序
x = df.sort_values(by='Nicky',ascending=False)      

4.7 DataFrame切片

# 指定範圍切片

df.iloc[0:2]

df.iloc[0:2,2:]

# 指定具體的行和列

df.iloc[[1,2],[3]]

4.8 擷取指定位置的值

df.iloc[0,2]

df.iat[1,1] //快速擷取

4.9 布爾索引

df[df.Nicky > 130]

4.10 整體過濾,所有不滿足條件的全部置空

df[df > 120]

4.11 isin

過濾資料

df[df['Nicky'].isin([125,260])]

就會把包括該值的資料提取出來

英語 105 125 125 115 
理綜 240 232 260 247       

4.12 unique

Series擷取唯一值,即重複的隻擷取一個值

4.13value_counts

Series計算各個值出現的次數

五 處理缺失資料

5.1 缺失值檢測

isnull: 檢測是否是缺失資料

notnull: 檢測是否不是缺失值 

5.2 過濾缺失資料

dropan: 根據标簽的值終是否存在缺失資料對軸标簽進行過濾(删除),可通過閥值調節對缺失值的容忍度

Series.dropna:隻是删除NaN值

# 預設删除是包含NaN值的行,即删除政策時any
DF.dropna()
# 如果某行全部都是NaN才進行删除,及删除政策是all
DF.dropna(how='all')

# 預設某列如果隻要有一個包含NaN,則删除
DF.dropna(axis=1)

# 如果某列全部包含NaN,則才删除
DF.dropna(axis=1,how='all')      

5.3 填充缺失資料

fillna:如果存在缺失值,用指定的值或者插入值方法ffill or bfill填充

# 預設填充填充
DF.fillna(0)
# 根據列索引指定預設值
DF.fillna({'age':18,'salary':-1,'gender':'Unisex'})      

六 階層化索引

# 在某個方向上擁有多個索引級别

# 通過階層化索引,pandas能夠以低次元形式處理高次元的資料

# 通過階層化索引,可以按層級統計資料

6.1Series階層化索引

s = Series([1,2,3,4,5],index=[['X','X','X','Y','Y'],['A','B','C','D','E']])
s.index.names = ['type','label']
print(s)      

X    A        1

     B        2

     C        3

Y    D        4

     E        5

6.2DataFrame階層化素索引

DF = DataFrame(

    {

       'year':[2015,2015,2016,2016,2017],

       'fruit':['apple','banala','apple','banana','apple'],

       'production':[2345,3432,4556,4455,2453],

       'profits':[2045,3132,4256,4155,2153]

    }

)

newDF = DF.set_index(['year','fruit'])
newDF.index
MultiIndex(levels=[[2015, 2016, 2017], ['apple', 'banala', 'banana']],
           labels=[[0, 0, 1, 1, 2], [0, 1, 0, 2, 0]],
           names=['year', 'fruit'])      
Python之Pandas庫一 Pandas資料結構二 Series三 DataFrame四 Pandas常用操作五 處理缺失資料六 階層化索引七 Pandas制圖八Matplotlib

6.3 按層級統計資料

# 按照年份統計求和
newDF.sum(level='year')

2015 5777 5177
2016 9011 8411
2017 2453 2153      

七 Pandas制圖

八Matplotlib

Matplotlib是Python中比較著名的繪圖庫,他提供了一整套和matlab相似的的指令API,十分适合互動式的進行制圖。而且也可以友善将它作為繪圖控件,嵌入GUI應用程式中。  

8.1 核心概念

Figure:Figure是一個頂層的容器,我們可以把它了解為畫布。這個容器可以包含所有東西 Subplot: Figure中用于畫圖的一個子區域 Axes: 坐标軸邊界,坐标刻度值 Title: 圖示題 Grid: 置網格顔色和線性 Xticks: X軸刻度 YTicks: Y軸刻度 XLabel: X軸标簽 YLabel: Y軸标簽 Line: 設定線條(顔色、線型、寬度等)和标記 Patch: 是填充2D空間的圖形對象,如多邊形和圓。控制線寬、顔色和抗鋸齒設定等。  

8.2 顔色

Python之Pandas庫一 Pandas資料結構二 Series三 DataFrame四 Pandas常用操作五 處理缺失資料六 階層化索引七 Pandas制圖八Matplotlib

8.3 标記

Python之Pandas庫一 Pandas資料結構二 Series三 DataFrame四 Pandas常用操作五 處理缺失資料六 階層化索引七 Pandas制圖八Matplotlib

8.4 簡單的matplotlib畫圖執行個體

X = np.linspace(-np.pi,np.pi,256,endpoint=True)
C,S = np.cos(X),np.sin(X)
plt.plot(X,C)
plt.plot(X,S)
# 建立一個 8 * 6的點的圖,并且設定分辨率為80
plt.figure(figsize=(8,6),dpi=80)
# 建立一個 1 * 1的子圖,接下來的圖會繪制在這個區域
plt.subplot(1,1,1) # 1 *1 的子圖繪制在第一塊裡,目前來說就是唯一的這一塊
# 設定X軸上下限
plt.xlim(-4.0,4.0)
# 設定x軸刻度
plt.xticks(np.linspace(-4,4,9,endpoint=True))
# 移動脊柱
ax = plt.gca()
# 去除後邊和上邊框
ax.spines['right'].set_color('None')
ax.spines['top'].set_color('None')
# 設定x軸和y軸的位置,中心點設定到了0這個位置
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.xaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))
# 繪制餘弦曲線,藍色,連續線,寬度為1像素
plt.plot(X,C,color='b',linewidth=1.0,linestyle=':',label='cos')
# 繪制正弦曲線,藍色,連續線,寬度為1像素
plt.plot(X,S,color='g',linewidth=1.0,linestyle='-',label='sin')

# 如果要使用這個,必須給plot函數加上label屬性
plt.legend(loc ='upper left')
# 儲存為圖檔,72的分辨率
plt.savefig('1.png',dpi=72)      

8.5matplotlib的輸出中文顯示問題

解決方案一: 修改matplotlib安裝目錄(Lib/site-packages/matplotlib)下mpl-data子目錄的matplotlibrc檔案,去掉font.family和font.sans-serif的注釋,并且在font.sans-serif添加FangSong中文字型 解決方案二: 實作以下函數,并調用:
from pylab import mpl
def set_ch():
    mpl.rcParams['font.sans-serif'] = ['FangSong']
    mpl.rcParams['axes.unicode_minus'] = False