一.Pandas簡介
Pandas(Python Data Analysis Library)基於Numpy構建,讓基於Numpy的應用更簡單,被廣泛應用於金融行業,流行的數據分析工具
二.Pandas安裝
由於Pandas是python的第三方庫,需要另外安裝
pip3 install pandas
三.Pandas的數據結構
Pandas主要有兩種數據結構:
- 系列(
Series
) - 數據幀(
DataFrame
)
系列(Series
)是能夠保存任何類型的數據(整數,字符串,浮點數,Python對象等)的一維標記數組。軸標簽統稱為索引。
數據幀(DataFrame)是二維數據結構,即數據以行和列的表格方式排列。
數據幀(DataFrame)的功能特點:
- 潛在的列是不同的類型
- 大小可變
- 標記軸(行和列)
- 可以對行和列執行算術運算
四.各個數據結構示例
1.Series
1)創建Series
import pandas as pd
obj=pd.Series([1,3,24,23,8])
print(obj)
print(obj.values)
print(obj.index)
print(obj[3])
2)自定義index
obj=pd.Series([1,3,8,24,23],index=['a','b','c','d','e'])
print(obj)
print(obj.index)
print(obj['d'])
也可以重新索引,如果某個索引值當前不存在,就引入缺失值,
In [10]: obj2=obj.reindex(['b','c','d','f','g'])
In [11]: obj2
Out[11]:
b 3.0
c 8.0
d 24.0
f NaN
g NaN
dtype: float64
對於缺失值,可以填充其他值
In [12]: obj2=obj.reindex(['b','c','d','f','g'],fill_value=0)
In [13]: obj2
Out[13]:
b 3
c 8
d 24
f 0
g 0
dtype: int64
3)使用字典創建Series
dic={'calvin':7,'kobe':24,'mj':23,'kd':35}
print(pd.Series(dic))
2.DataFrame
data={'name':['calvin','kobe','michale','durant','james'],'age':[29,40,56,30,34],'height':[1.70,1.98,1.98,2.06,2.03]} #從字典創建DataFrame
data2=[['a',1],['b',2],['c',3]] #從列表創建DataFrame
data3 = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])} #從系列的字典來創建DataFrame
dd = pd.DataFrame(data3)
df=pd.DataFrame(data2,columns=['name','age']) #加入列標簽
dd['three']=pd.Series([10,20,30],index=['a','b','c']) #增加列
del dd['one'] #刪除列
print(pd.DataFrame(data))
print(df)
print (dd)
print(dd['one']) #列選擇
print(dd.loc['b']) #行選擇(標簽選擇)
print(dd.iloc[1]) #行選擇(按整數位置選擇)
print(dd[0:2]) #行切片
下表列出了DataFrame構造函數所能接受的各種數據:
類型 說明
二維ndarray 數據矩陣,還可以傳入行標和列標
由數組、列表或元組組成的字典 每個序列會變成DataFrame的一列。所有序列的長度必須相同
Numpy的結構化/記錄數組 類似於“由數組組成的字典”
由Series組成的字典 每個Series會成為一列。如果沒有顯示指定索引,則各Series的索引會被合並成結果的行索引
由字典組成的字典 各內層字典會成為一列。鍵會被合並成結果的行索引,跟“由Series組成的字典”的情況一樣
字典或Series的列表 各項將會成為DataFrame的一行。字典鍵或Series索引的並集將會成為DataFrame的列標
由列表或元組組成的列表 類似於“二維ndarray”
另一個DataFrame 該DataFrame的索引將會被沿用,除非顯式指定了其他索引
Numpy的MaskedArray 類似於“二維ndarray”的情況,只是掩碼值在結果DataFrame會變成NA/缺失值
五.讀取Excel文件&CSV文件
新建一個測試用的Excel,命名為
google.xlsx
並加入一些數據,放入到pycharm工程目錄下,數據如下圖:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data=pd.read_excel("google.xlsx")
print(data.head(3)) #讀取前三行數據
print(data.tail(3)) #讀取后三行數據
print(data.describe()) #數據概要統計
#使用日期做索引
dates=pd.to_datetime(data['Date'])
df=data.set_index(dates)
df.drop('Date',1,inplace=True)
df['Close'].plot()
plt.show() #顯示圖片
loc——通過行標簽索引行數據
iloc——通過行號索引行數據
#訪問某列
print(df['Close'])
#切片,獲取指定的行
print(df['2018-08-08':'2018-08-18'])
#索引切片
print(df.loc['2018-08-09',['Open','Close']]) #兩個維度切片
print(df.loc['2018-08-09','Open']) #查看2018-08-09這個日期的Open值
print(df.loc['2018-08-02':'2018-08-06','Close']) #查看2018-08-02到2018-08-06之間的Close值
print(df.loc['2018-08-04':'2018-08-08',['Open','Close']]) #查看2018-08-02到2018-08-06之間的Open值和Close值
#位置切片
print(df.iloc[0,:]) #查看第一條數據
print(df.iloc[-5:,:])#獲取倒數五條數據
print(df.iloc[-20:-10:4]) #步長為4,獲取倒數20行到倒數10行的數據
print(df.iloc[0,0]) #獲取第一條的第一個數據
print(df.at[dates[0],'Close']) #獲取第一個日期的Close值
print(df[df['Open']>60]) #篩選數據,獲取Open值大於60的數據
df['Fake']=pd.Series(np.random.randn(len(df)),index=dates) #增加一列數據
print(df)
df2=df.copy() #拷貝一個df2
df2[df2<0]=np.nan #小於0的全部設為NAN
print(df2)
print(df.mean()) #每一列的平均值
print(df.mean(1)) #每一行的平均值
print(df.groupby(by=df.index.year).mean()) #以年分組,求各年份的平均值
print(df.sort_values(by='Open',ascending=False)) #默認升序排序,ascending=False設置降序排列
#批量迭代讀取csv
data2=pd.read_csv('test.csv',iterator=True,chunksize=10000,usecols=['date'])
print(data2.get_chunk(4)) #獲取前四行的數據
print(data2) #顯示一串字符串 <pandas.io.parsers.TextFileReader object at 0x004CC490>
for i in data2: #迭代讀取csv的數據
print(i)