1. 程式人生 > >Pandas中DataFrame用法總結

Pandas中DataFrame用法總結

DataFrame:類似於表的資料結構

Array/Series/DataFrame對比學習
本文對Pandas包中二維(多維)資料結構DataFrame的特點和用法進行了總結歸納。
可以參考:pandas用法速覽
Pandas包之DataFrame

3.1 增加資料

3.1.1 建立資料框Object Creation

import pandas as pd
import numpy as np
#通過Numpy array來建立資料框
dates=pd.date_range('2018-09-01',periods=7)
dF1=pd.DataFrame(np.random.rand(7,4),index=dates) #從標準正態分佈中返回一個數組

#通過dict來建立資料框
dataDict={'A':1., 'B':pd.Timestamp('20180901'), 'C':pd.Series(1,index=range(4),dtype='float'), 'D':np.array([3]*4,dtype='int'), 'E':pd.Categorical(['test','train','test','train']), 'F':'foo' } dF2=pd.DataFrame(dataDict) dF2.info() #檢視資料型別

3.1.2 整合資料

Concat/Merge/Append
Concat:將資料框拼接在一起(可按rows或columns)
Merge:類似於SQL中Join的用法
Append:將資料按rows拼接到資料框中

#Concat:將資料框拼接在一起(可按rows或columns)
dF=pd.DataFrame(np.random.randn(10,4))
#將資料框拆分後在拼接
pieces1=dF[:3]
pieces2=dF[3:7]
pieces3=dF[7:] 
pd.concat([pieces1,pieces2,pieces3],axis=0) #拼接
#Merge(類似於SQL中Join的用法)
left=pd.DataFrame({'key':['foo','foo'],'value':[1,2]}) right=pd.DataFrame({'key':['foo','foo'],'value':[4,5]}) #根據key進行連線 pd.merge(left,right,on='key')

Python中Merge()函式用法

#Append:將資料按rows拼接到資料框中
df=pd.DataFrame(np.random.randn(8,4),columns=['A','B','C','D']
                ,index=range(1,9))
s=df.iloc[0] #提取第一行資料
df.append(s,ignore_index=False) #ignore_index若為Ture則插入資料後索引將更新,否則保持原有索引值

3.1.3 匯入/匯出資料Getting Data In/Out

Csv/Excel

#Csv
#匯出為Csv檔案,名稱及位置(預設和notebook檔案同一目錄下)
df.to_csv('foo.csv') 
#匯入Csv檔案
fileDf=df.read_csv('foo.csv') 

#Excel
#匯出為xlsx檔案
df.to_excel('foo.xlsx',sheet_name='Sheet1') 
#匯入制定表的sheet資料
fileDf=pd.read_excel('Python資料/朝陽醫院2018年銷售資料.xlsx','Sheet1') 

3.2 檢視資料

3.2.1 檢視資料Viewing Data

檢視資料三部曲:
head():檢視資料前幾項,看資料長什麼樣
info():檢視資料型別,以及資料缺失情況
descibe():檢視資料描述統計性資訊,資料大概分佈情況

#匯入資料
fileDf=pd.read_excel('Python資料/朝陽醫院2018年銷售資料.xlsx','Sheet1') 

fileDf.head()
fileDf.info()
fileDf.describe()
#資料轉置
fileDf.T
#按指定屬性值排序
fileDf.sort_values('銷售數量',ascending=False) #按照‘銷售數量’降序排列資料
#檢視某資料數值的分佈
fileDf['商品名稱'].value_counts()

3.2.2 選取資料Selection

#直接切片獲取資料(行根據位置,列根據列名)
fileDf['商品名稱']  #根據屬性名,獲取列
fileDf[0:3] #切片獲取位置(0:2)的資料,相當於fileDf.iloc[0:3]

#利用loc根據標籤值Label獲取資料:可以交叉取值
fileDf.loc[0:3,['商品名稱','銷售數量']] #獲取索引值為(0:3)的中'商品名稱'的資料
fileDf.loc[1] #獲取索引值為2的所有資料

#利用iloc根據位置獲取Position資料
fileDf.iloc[1] #獲取第二行的所有資料
fileDf.iloc[1:3,[0,3]] #獲取第二、三行,一、四列的資料

#利用布林值判斷取數
fileDf[fileDf['銷售數量']>30] #提取“銷售數量”大於30的資料

#isin()方法,類似於SQL中的in方法
fileDf[fileDf['商品名稱'].isin(['感康'])] #提取“商品名稱”為感康的所有資料

#提取“商品名稱”為感康,且“銷售數量”大於5的所有資料
fileDf[fileDf['商品名稱'].isin(['感康'])&(fileDf['銷售數量']>5)] 

3.2.3 資料操作Operations

stats/Apply
Apply:(用於dataframe,對row或column進行操作)類似於map(python自帶,用於series,元素級別的操作)

#stats
fileDf.mean() #求均值
fileDf['實收金額'].mean() #求某列均值

#apply
df.apply(lambda x:x.max()-x.min())

3.2.4 分組操作Grouping

類似於SQL中的group by 分組操作

#根據商品名稱進行分組求和,得到每種商品的'銷售數量','應收金額','實收金額'
fileDf.groupby('商品名稱').sum()[['銷售數量','應收金額','實收金額']]
#根據時間和商品名稱進行分組求和,得到每天每種商品的'銷售數量','應收金額','實收金額'
fileDf.groupby(['購藥時間','商品名稱']).sum()[['銷售數量','應收金額','實收金額']]

3.3 修改資料

3.3.1 缺失值處理Missing Data

pandas中主要用np.nan來代表缺失值(NaN),缺失值一般不進行計算操作

#剔除有缺失值的行
fileDf.dropna(how='any')
#填充缺失值
fileDf.fillna(value=5) #用特定值填充
#找出‘商品名稱’中有空缺值的行
fileDf[fileDf['商品名稱'].isnull()]

3.3.2 改變形狀Reshaping

Pivot Tables:類似excel中的資料透視表,重新組合行和列

#利用字典建立資料框
df=pd.DataFrame({'A':['one','one','two','three']*3,
                'B':['A','B','C']*4,
                'C':['foo','foo','foo','bar','bar','bar']*2,
                'D':np.random.randn(12),
                'E':np.random.randint(0,5,12)}
)
print(df)
#分析D資料在A/B/C屬性不同時的值
pd.pivot_table(df,values='D',index=['A','B'],columns=['C'])

3.4 時間序列Time Series

#建立間隔為1s總數100個時間序列
rng=pd.date_range('20180901',periods=100,freq='S')
#以時間序列為索引值,建立Series
ts=pd.Series(np.random.randint(0,500,len(rng)),index=rng)
#以1min為間隔進行求和
ts.resample('1Min').sum()

#建立間隔為1天總數5個時間序列
rng=pd.date_range('9/1/2018 00:00',periods=5,freq='D')
#以時間序列為索引值,建立Series
ts=pd.Series(np.random.randn(len(rng)),index=rng)

如果對於本文中程式碼或資料有任何疑問,歡迎評論或私信交流

相近文章:
Numpy中Array用法總結
Pandas中Series用法總結