數據分析之Pandas庫

1 Pandas介紹

Pandas由WesMcKinney開發,是一種專門用於數據挖掘的庫。其以Numpy庫爲基礎,借力Numpy模塊在計算方面性能高的優勢來增強性能。也基於matplotlib庫,能夠簡便繪圖,並且有着獨特的數據結構。

2 使用Pandas的優勢

Numpy已近可以幫助我們解決問題,能夠結合Matplotlib解決部分數據的展示等問題,那爲什麼要使用Pandas,使用它的優勢主要有以下幾個部分:

  • 增強圖表的可讀性
  • 便捷的數據處理能力
  • 讀取文件特別方便
  • 封裝了Matplotlib的畫圖和Numpy的計算
3 Pandas數據結構

Pandas一共有三種數據結構,分別是Series、DataFrame和MultiIndex。三者分別是一維數據結構、二維數據結構和三維數據結構

➢ Series結構

Series是一個類似於一維數組結構,它能夠保存任何數據類型的數據,如整數、字符串、浮點數等,主要由一組數據和與之相關聯的數組兩部分組成

Series的創建(通過已有數據創建):

import pandas as pd
# data:傳入的數據,可以是ndarray、list等
# index:索引,必須是唯一且與數據的長度相等,如果沒有傳入索引參數,則默認會自動創建一個從0~N的整數索引
# dtype:數據類型
pd.Series(data=None, index=None, dtype=None)
  • 指定內容默認索引創建
import pandas as pd
import numpy as np
pd.Series(data=np.arange(10))

在這裏插入圖片描述

  • 指定索引創建
import pandas as pd
pd.Series(data=[6, 7, 8, 9, 10], index=[0, 1, 2, 3, 4])

在這裏插入圖片描述

  • 通過字典數據創建
import pandas as pd
pd.Series(data={'name': 'thanlon', 'age': 24, 'address': '中國上海'})

在這裏插入圖片描述
爲更方便地操作Series對象中的索引和數據,Series中提供兩個屬性,分別是index和values。Series的屬性:

  • index
import pandas as pd
staff = pd.Series(data={'name': 'thanlon', 'age': 24, 'address': '中國上海'})
print('職員的姓名:',staff[0])
print('職員的年齡:',staff['age'])
print(staff.index)

在這裏插入圖片描述

  • values
import pandas as pd
staff = pd.Series(data={'name': 'thanlon', 'age': 24, 'address': '中國上海'})
print(staff.values) # <class 'numpy.ndarray'>

在這裏插入圖片描述
➢ DataFrame結構:

DataFrame是一個類似於二維數組或表格的對象,既有行索引和列索引。DataFrame的創建:

import pandas as pd
# index:行標籤,如果沒有傳入索引參數,則默認會自動創建一個從0~N的整數索引
# columns:列標籤,如果沒有傳入索引參數,則默認會自動創建一個從0~N的整數索引
pd.DataFrame(data=None, index=None, columns=None)

例一:

import pandas as pd
import numpy as np
pd.DataFrame(data=np.random.randn(2, 3))

在這裏插入圖片描述
例二:

# 分別使用numpy和pandas生成學生的成績表,生成10個同學的6個科目的成績
import numpy as np
score = np.random.randint(0, 100, (10, 6))
print(score)
score_df = pd.DataFrame(score)
score_df

在這裏插入圖片描述
增加行列索引:

import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
print(score)
score_df = pd.DataFrame(score)
print(score_df)
# 構建行索引序列
subjects = ['語文', '數學', '英語', '歷史', '政治', '數學']
# 構建列索引序列
stu = ['學生'+str(i+1) for i in range(score_df.shape[0])]
# 添加行索引
data = pd.DataFrame(data=score,  index=stu, columns=subjects)
data

在這裏插入圖片描述
DataFrame的屬性:

  • shape:查看幾行幾列
'''
查看幾行幾列
'''
import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
score_df = pd.DataFrame(score)
subjects = ['語文', '數學', '英語', '歷史', '政治', '數學']
stu = ['學生'+str(i+1) for i in range(score_df.shape[0])]
data = pd.DataFrame(data=score,  index=stu, columns=subjects)
print(data.shape)
data

在這裏插入圖片描述

  • index:獲取行索引列表
'''
獲取行索引列表
'''
import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
score_df = pd.DataFrame(score)
subjects = ['語文', '數學', '英語', '歷史', '政治', '數學']
stu = ['學生'+str(i+1) for i in range(score_df.shape[0])]
data = pd.DataFrame(data=score,  index=stu, columns=subjects)
print(data.index)
data

在這裏插入圖片描述

  • columns:獲取列索引列表
'''
獲取列索引列表
'''
import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
score_df = pd.DataFrame(score)
subjects = ['語文', '數學', '英語', '歷史', '政治', '數學']
stu = ['學生'+str(i+1) for i in range(score_df.shape[0])]
data = pd.DataFrame(data=score,  index=stu, columns=subjects)
print(data.columns)
data

在這裏插入圖片描述

  • values:獲取數組的值
'''
獲取數組的值
'''
import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
score_df = pd.DataFrame(score)
subjects = ['語文', '數學', '英語', '歷史', '政治', '數學']
stu = ['學生'+str(i+1) for i in range(score_df.shape[0])]
data = pd.DataFrame(data=score,  index=stu, columns=subjects)
print(data.values)
data

在這裏插入圖片描述

  • T:轉置
import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
score_df = pd.DataFrame(score)
subjects = ['語文', '數學', '英語', '歷史', '政治', '數學']
stu = ['學生'+str(i+1) for i in range(score_df.shape[0])]
data = pd.DataFrame(data=score,  index=stu, columns=subjects)
data.T

在這裏插入圖片描述

  • head(n):查看前n行,如果不傳入n,默認是5行。如果數據沒有5行,則默認查看所有行。
import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
score_df = pd.DataFrame(score)
subjects = ['語文', '數學', '英語', '歷史', '政治', '數學']
stu = ['學生'+str(i+1) for i in range(score_df.shape[0])]
data = pd.DataFrame(data=score,  index=stu, columns=subjects)
data.head(4)

在這裏插入圖片描述

  • tail(n):查看後n行,如果不傳入n,默認是5行。如果數據沒有5行,則默認查看所有行。
import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
score_df = pd.DataFrame(score)
subjects = ['語文', '數學', '英語', '歷史', '政治', '數學']
stu = ['學生'+str(i+1) for i in range(score_df.shape[0])]
data = pd.DataFrame(data=score,  index=stu, columns=subjects)
data.tail(2)

在這裏插入圖片描述
DataFrame索引的設置:

  • 修改行列索引值
'''
必須整體全部修改,不能使用索引方式改局部,如data.index[0] = '學生_1'
'''
import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
score_df = pd.DataFrame(score)
subjects = ['語文', '數學', '英語', '歷史', '政治', '數學']
stu = ['學生'+str(i+1) for i in range(score_df.shape[0])]
data = pd.DataFrame(data=score,  index=stu, columns=subjects)
stu1 = ['學生_'+str(i+1) for i in range(score_df.shape[0])]
data.index = stu1
data

在這裏插入圖片描述

  • 重設索引
'''
使用reset_index(drop=False),可以用來設置新的下標索引,drop:默認是False,不刪除原來的索引,如果爲True,刪除原來的索引值
不刪除原來的索引
'''
import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
score_df = pd.DataFrame(score)
subjects = ['語文', '數學', '英語', '歷史', '政治', '數學']
stu = ['學生'+str(i+1) for i in range(score_df.shape[0])]
data = pd.DataFrame(data=score,  index=stu, columns=subjects)
data = data.reset_index()
data

在這裏插入圖片描述

'''
使用reset_index(drop=False),可以用來設置新的下標索引,drop:默認是False,不刪除原來的索引,如果爲True,刪除原來的索引值
刪除原來的索引
'''
import numpy as np
import pandas as pd
score = np.random.randint(60, 100, (9, 6))
score_df = pd.DataFrame(score)
subjects = ['語文', '數學', '英語', '歷史', '政治', '數學']
stu = ['學生'+str(i+1) for i in range(score_df.shape[0])]
data = pd.DataFrame(data=score,  index=stu, columns=subjects)
data = data.reset_index(drop=True)
data

在這裏插入圖片描述

  • 以某列值設置爲新的索引
'''
設置新的索引:set_index(keys, drop=True)
keys:列索引名稱或列索引名稱的列表
drop:boolean類型,默認是True,當做新的索引,刪除原來的列
以月份設置新的索引
'''
import pandas as pd
df = pd.DataFrame({
    'month': [1, 2, 3, 4],
    'year': [2017,2018, 2019, 2020],
    'sale': [66, 77, 88, 99]
})
df = df.set_index('month') # 設置單個索引
df

在這裏插入圖片描述

'''
設置新的索引:set_index(keys, drop=True)
keys:列索引名稱或列索引名稱的列表
drop:boolean類型,默認是True,當做新的索引,刪除原來的列
以年份和月份設置新的索引
'''
import pandas as pd
df = pd.DataFrame({
    'month': [1, 2, 3, 4],
    'year': [2017, 2018, 2019, 2020],
    'sale': [66, 77, 88, 99]
})
df = df.set_index(['year', 'month']) # 設置多個索引,要使用列表
df

在這裏插入圖片描述

DataFrame通過修改可以變成MultiIndex結構。

➢ MultiIndex結構

MultiIndex是三維的數據結構,即多級索引,也稱爲層次化的索引。層次化索引是pandas的重要功能,可以在Series、DataFrame對象上擁有2個及其以上的索引。除了通過修改DataFrame數據結構變成MulitiIndex結構,還可以直接創建。

MultiIndex的創建:

import pandas as pd
arrays = [['thanlon', 'kiku', 'kili'], [22, 23, 24]]
pd.MultiIndex.from_arrays(arrays=arrays, names=('name', 'age'))

在這裏插入圖片描述
MultiIndex的特性:

'''
index
'''
import pandas as pd
df = pd.DataFrame({
    'month': [1, 2, 3, 4],
    'year': [2017, 2018, 2019, 2020],
    'sale': [66, 77, 88, 99]
})
df = df.set_index(['year', 'month'])
df.index

在這裏插入圖片描述

'''
index.names
'''
import pandas as pd
df = pd.DataFrame({
    'month': [1, 2, 3, 4],
    'year': [2017, 2018, 2019, 2020],
    'sale': [66, 77, 88, 99]
})
df = df.set_index(['year', 'month'])
df.index.names

在這裏插入圖片描述

import pandas as pd
df = pd.DataFrame({
    'month': [1, 2, 3, 4],
    'year': [2017, 2018, 2019, 2020],
    'sale': [66, 77, 88, 99]
})
df = df.set_index(['year', 'month'])
df.index.levels

在這裏插入圖片描述

import pandas as pd
df = pd.DataFrame({
    'month': [1, 2, 3, 4],
    'year': [2017, 2018, 2019, 2020],
    'sale': [66, 77, 88, 99]
})
df = df.set_index(['year', 'month'])
df.index.codes

在這裏插入圖片描述
➢ Panel結構(Panel已被廢棄,這裏只作瞭解)

Panel是MultiIndex的前身,Panel的創建:

'''
pandas.Panel(data-None, items=None, major_axis=None, minor_axis=None):存儲3維數組的Panel結構
data:ndarray或者DataFrame,表示整體的數據
items:索引或類似數組的對象,axis=0
major_axis:索引或類似數組的對象,axis=1
minor_axis:索引或類似數組的對象,axis=2
'''
import pandas as pd
import numpy as np
# 24個數,第一個維度是4,第二個維度是3,第三個維度是2,三維
data = np.arange(24).reshape(4, 3, 2)
items = list('ABCD')  # ['A', 'B', 'C', 'D']
major_axis = pd.date_range('20200227', periods=3) # DatetimeIndex(['2020-02-27', '2020-02-28', '2020-02-29'], dtype='datetime64[ns]', freq='D')
minor_axis = ['first', 'second']
pd.Panel(data=data, items=items, major_axis=major_axis, minor_axis=minor_axis)

在這裏插入圖片描述
Panel數據的查看:

 import pandas as pd
import numpy as np
# 24個數,第一個維度是4,第二個維度是3,第三個維度是2,三維
data = np.arange(24).reshape(4, 3, 2)
items = list('ABCD')  # ['A', 'B', 'C', 'D']
major_axis = pd.date_range('20200227', periods=3) # DatetimeIndex(['2020-02-27', '2020-02-28', '2020-02-29'], dtype='datetime64[ns]', freq='D')
minor_axis = ['first', 'second']
p = pd.Panel(data=data, items=items,
             major_axis=major_axis, minor_axis=minor_axis)
p[:, :, 'first']  # :表示取所有
p['A', :, :]
4 基本數據操作

➢ 索引操作

直接使用行列索引(先行後列):

結合loc或者iloc使用索引:

使用ix組合索引:

5 DataFrame運算
6 Pandas繪圖

➢ Pandas.Series繪圖

繪製折線圖:

import pandas as pd
import numpy as np
import random
data = []
for i in np.arange(0, 100, 10):
    data.append(random.randint(10, 20))
s = pd.Series(data=data)
print(s)
s.plot(kind='line')  # s.plot.line(),s.plot()函數的參數kind默認是'line'

在這裏插入圖片描述
繪製柱狀圖:

import pandas as pd
import numpy as np
import random
data = []
for i in np.arange(0, 100, 10):
    data.append(random.randint(10, 20))
s = pd.Series(data=data)
print(s)
s.plot(kind='bar')

在這裏插入圖片描述

import pandas as pd
import numpy as np
import random
data = []
for i in np.arange(0, 100, 10):
    data.append(random.randint(10, 20))
s = pd.Series(data=data)
print(s)
s.plot(kind='barh')

在這裏插入圖片描述
繪製直方圖:

import pandas as pd
import numpy as np
import random
data = []
for i in np.arange(0, 100, 10):
    data.append(random.randint(10, 20))
data = np.random.normal(1.75, 1, 10000) 
s = pd.Series(data=data)
print(s)
s.plot(kind='hist')

在這裏插入圖片描述
➢ Pandas.DataFrame繪圖

繪製折線圖:

import pandas as pd
import numpy as np
data = np.random.randn(10, 2)  # 從標準動態分佈中返回一個或多個樣本值
print(data)
df = pd.DataFrame(data=data)
print(df)
df.plot(kind='line')  # df.plot()函數的參數kind默認是'line'

在這裏插入圖片描述
繪製柱狀圖:

import pandas as pd
import numpy as np
data = np.random.randn(10, 3)  # 從標準動態分佈中返回一個或多個樣本值
print(data)
df = pd.DataFrame(data=data)
print(df)
df.plot(kind='bar')  # df.plot.line(),df.plot()函數的參數kind默認是'line'

在這裏插入圖片描述

import pandas as pd
import numpy as np
data = np.random.randn(10, 3)  # 從標準動態分佈中返回一個或多個樣本值
df = pd.DataFrame(data=data)
df.plot(kind='barh')  # df.plot()函數的參數kind默認是'line'

在這裏插入圖片描述
繪製直方圖:

import pandas as pd
import numpy as np
data = np.random.randn(10, 3)  # 從標準動態分佈中返回一個或多個樣本值
print(data)
df = pd.DataFrame(data=data)
print(df)
df.plot(kind='hist')  # df.plot()函數的參數kind默認是'line'

在這裏插入圖片描述

7 文件讀取與存儲

➢ CSV格式文件的讀取與存儲

test.csv:
在這裏插入圖片描述
CSV格式文件的讀取:

'''
讀取數據,並且指定只獲取age和addr指標
'''
import pandas as pd
pd.read_csv(filepath_or_buffer='test.csv')
# filepath_or_buffer:文件路徑;usecols:指定讀取的列名;sep:默認是以逗號分割
pd.read_csv(filepath_or_buffer='test.csv', usecols=['name', 'age'], sep=',')

在這裏插入圖片描述
CSV格式文件的存儲:

'''
存儲數據
'''
import pandas as pd
data = pd.read_csv(filepath_or_buffer='test.csv',
                   usecols=['name', 'age'], sep=',')
# to_csv的參數,columns:選擇需要的列索引;header:是否寫進列索引值,默認是True;index:是否寫進索引,默認是True。mode:重寫(w)與追加(a)
data.to_csv(path_or_buf='tmp.csv', columns=[
            'name'], header=True, index=None, mode='w')
data = pd.read_csv(filepath_or_buffer='tmp.csv')
data

在這裏插入圖片描述

'''
存儲數據,不保存索引
'''
import pandas as pd
data = pd.read_csv(filepath_or_buffer='test.csv', usecols=['name', 'age'], sep=',') # 
data.to_csv(path_or_buf='tmp.csv',columns=['name'],index=False)
data = pd.read_csv(filepath_or_buffer='tmp.csv')
data

在這裏插入圖片描述
➢ HDF5格式文件的讀取與存儲

創建HDF5文件:

首先安裝h5py模塊:thanlon@thanlon-master:~$ sudo pip3 install h5py -i https://pypi.tuna.tsinghua.edu.cn/simple

創建好的HDF5文件:

import h5py
f = h5py.File('hd.h5', 'w')
lst1 = ['thanlon', 'kiku', 'kili']
column_01 = []
for i in lst1:
    column_01.append(i.encode())
f['name'] = column_01
f['age'] = [11,22,23]
print(f.keys())
print(f['name'][:])
print(f['age'][:])
f.close()

HDF5格式文件的讀取:

# 安裝tables模塊,sudo pip3 install tables -i https://pypi.tuna.tsinghua.edu.cn/simple
import pandas as pd
data = pd.read_hdf('hd.h5')
data.head()

HDF5格式文件的存儲:

import pandas as pd
data = pd.read_hdf('hd.h5')
data.to_hdf('hd.h5', key='data')  # 注意這裏必須有要有key
pd.read_hdf('hd.h5', key='data')

HDF5在存儲的時候,使用的方式blosc,這種方式是速度讀取快,也是pandas默認支持的。使用壓縮提高磁盤利用率節省空間。HDF5還是跨平臺的,可以輕鬆遷移到hadoop上面。

➢ JSON格式文件的讀取與存儲

JSON格式文件的讀取:


JSON格式文件的存儲:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章