NumPy、Pandas、Scipy是python的三個(gè)庫,也是數(shù)據(jù)分析的常用庫。其中,numpy學(xué)習(xí)強(qiáng)烈推薦NumPy中文文檔。Pandas是基于NumPy的一種工具,數(shù)據(jù)操作更加方便,這里總結(jié)了Pandas的一些教程,更多內(nèi)容查看官方文檔說明。
安裝包
pip install pandas
載入包
import pandas as pd
創(chuàng)建數(shù)組
pandas常用數(shù)據(jù)結(jié)構(gòu)中,一維Series,二維DataFrame,三維Panel。
Series 數(shù)據(jù)結(jié)構(gòu)與list相似,但只允許存儲(chǔ)相同的數(shù)據(jù)類型,同時(shí),Series可以自定義索引,索引默認(rèn)從0開始遞增。
pd.Series(data=None, index=None, dtype=None, name=None, copy=False, fastpath=False)
pd.Series(["小蘭","女",24,"Beijing"],list("abcd"))
輸出:
a 小蘭
b 女
c 24
d Beijing
dtype: object
DataFrame 可看做Series組成的字典,通常定義DataFrame可用dict定義,類似于excel和myslq的表格。
pd.DataFrame(data = None, index = None, columns = None, dtype = None, copy = False )
#舉例
dict = {"name": ["小蘭","小民","小紅"],
"sex":["女","男","女"],
"age":[24,20,21],
"city":["Beijing","Beijing","Tianjin"]}
df = pd.DataFrame(dict)
輸出:
| name | sex | age | city | |
|---|---|---|---|---|
| a | 小蘭 | 女 | 24 | Beijing |
| b | 小民 | 男 | 20 | Beijing |
| c | 小紅 | 女 | 21 | Tianjin |
DataFrame還可以通過info直接查看數(shù)據(jù)類型和統(tǒng)計(jì),dtypes查看數(shù)據(jù)類型,shape查看形狀,describe匯總統(tǒng)計(jì)。
df.info()
df.dtypes
df.shape
df.describe()
info()輸出如下,可以查看數(shù)據(jù)類型和數(shù)量,空值數(shù)量
<class 'pandas.core.frame.DataFrame'>
Index: 3 entries, a to c
Data columns (total 4 columns):
name 3 non-null object
sex 3 non-null object
age 3 non-null int64
city 3 non-null object
dtypes: int64(1), object(3)
memory usage: 120.0+ bytes
describe()輸出如下:
增刪行列
增加列,和字典操作一樣,可以通過直接在后面插入列的方式,另外還可以使用insert函數(shù)
insert(loc, column, value, allow_duplicates=False)
df[新增列名] = [內(nèi)容] #增加列,默認(rèn)插入到最后一列
#舉例
data = [1,1,2]
df.insert(0,"class",data) #loc為指定位置,這里為0,則插入開頭
| class | name | sex | age | city | |
|---|---|---|---|---|---|
| a | 1 | 小蘭 | 女 | 24 | Beijing |
| b | 1 | 小民 | 男 | 20 | Beijing |
| c | 2 | 小紅 | 女 | 21 | Tianjin |
增加行
pd.DataFrame.append(other, ignore_index=False,
verify_integrity=False, sort=None)
#舉例
dict_1 = {"class":[2,2],
"name": ["小新","小花"],
"sex":["男","女"],
"age":[19,22],
"city":["Shanghai","Tianjin"]}
df_1 = pd.DataFrame(dict_1,list("ab"))
df_2 = df.append(df_1,ignore_index=True) #ignore_index為是否重新排序,True重新排序,F(xiàn)alse則為原本序號(hào)
| class | name | sex | age | city | |
|---|---|---|---|---|---|
| 0 | 1 | 小蘭 | 女 | 24 | Beijing |
| 1 | 1 | 小民 | 男 | 20 | Beijing |
| 2 | 2 | 小紅 | 女 | 21 | Tianjin |
| 3 | 2 | 小新 | 男 | 19 | Shanghai |
| 4 | 2 | 小花 | 女 | 22 | Tianjin |
刪除行列
刪除列,可使用pop()以及del直接刪除,刪除行列則可以使用drop(),建議使用drop()而不是del,因?yàn)閐rop()不改變?cè)瓟?shù)據(jù),而是重新生成新的數(shù)據(jù),同樣的還有append()。
drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')#axis = 0表示行,1表示列,默認(rèn)為0
df.pop("age") #刪除并返回age列
del df["age"] #直接刪除age列
#舉例
df_2.drop(index=[1,2],columns= "city") #表示刪除1,2行以及city列
df_2.drop("city",axis=1) #刪除city列
df_2.drop([1,2]) #刪除1、2行
修改索引
如果需要修改數(shù)組的索引,可以使用rename()
rename(mapper=None, index=None, columns=None, axis=None, copy=True, inplace=False, level=None)
#舉例
df_2.rename({0:"a",1:"b",2:"c",3:"d",4:"e"}) #直接修改,默認(rèn)修改index
df_2.index=["a","b","c","d","e"] #使用index或columns直接修改會(huì)改變?cè)瓟?shù)據(jù),rename()則不改變?cè)瓟?shù)據(jù)
df_2.rename(str.upper,axis="columns") #將列名改為大寫,axis默認(rèn)為"index"
df_2.rename(index= lambda x: x+2) #修改行序號(hào)為
df_2.rename(columns={"age":"年齡"}) #修改age列為“年齡”
修改值,可以直接通過
索引和切片
通過索引方式直接選取列,可以使用方括號(hào)[ ],也可以直接引用列名。
df_2["age"]
df_2[["age","city"]] #選取多列
df_2.age
行的選取可以通過iloc,loc以及ix,loc是location(位置),iloc的i是integer(整數(shù)),從名字就可以看出兩者的區(qū)別。
df.iloc[1]
df.loc["b"]
兩者輸出均為一樣
class 1
name 小民
sex 男
age 20
city Beijing
Name: b, dtype: object
pandas同樣能夠進(jìn)行切片操作,還可以利用iloc方便進(jìn)行切片操作,可以參考numpy切片
df.iloc[1:3] #等同于df[1:3],df.loc[["b","c"]]
df_2.iloc[1:3]
df_2.loc[1:3] #當(dāng)行索引為默認(rèn)數(shù)字時(shí)可使用loc,注意loc[1:3]為閉區(qū)間,取1,2,3行,區(qū)別df_2.iloc[1:3]
通過切片可以方便地批量修改特定位置值,如:
df_2[:4,3]=18
df_2.iloc[1]["age"] =20
可以試試下面的輸出的結(jié)果
df_2.iloc[:2,:3]
df_2.iloc[2,3]
df_2.iloc[::2,::3]
df_2.iloc[::-1]
算術(shù)運(yùn)算
和numpy一樣,pandas也能對(duì)數(shù)組進(jìn)行運(yùn)算
add(other, axis='columns', level=None, fill_value=None)
類似add()的還有sub(),mul(),div()......分別為加減乘除。
sum(axis=None, skipna=None, level=None, numeric_only=None, min_count=0, **kwargs)
類似sum()的還有max(),min()
a = pd.DataFrame(np.arange(9).reshape(3,3))
b = pd.DataFrame(np.arange(16).reshape(4,4))
#輸入代碼查看結(jié)果
a+b #a.add(b)
a.div(b)
a.add(b, fill_value = 0)
a.add([5,5,6], axis="index")
a.sum()
a.sum(axis=1)
a.max()
查找缺失值
數(shù)據(jù)常常需要先處理缺失值,再進(jìn)行數(shù)據(jù)分析,這里用到fillna()或者replace()替換缺失值,dropna()去除缺失值。
fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad')
dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
c = pd.DataFrame([[np.nan, 2, np.nan, 0],
[3, 4, np.nan, 1],
[np.nan, np.nan, np.nan, 5],
[np.nan, 3, np.nan, 4]],
columns=list('ABCD'))
c.fillna(1) #替換空值為1
c.replace(np.nan,1) #同上
c.dropna(axis=1,how = "all") #刪除所有值為空值的列,how="any"為任意值為空值,
c.dropna(thresh = 2) #每行只有有2個(gè)非空值才保留
c.dropna(subset=["D","A"]) #刪除保留A、D列有空值的行
數(shù)組連接
數(shù)據(jù)的合并、連接需要用到merge、join、concat函數(shù),官方文檔:
merge類似于sql的左右內(nèi)外連接,通過列鍵連接;
join通過行索引連接,以及將鍵轉(zhuǎn)為索引連接;后續(xù)會(huì)寫具體使用方法,這里就不詳細(xì)說明。
merge(right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
how:連接方式, {‘left’, ‘right’, ‘outer’, ‘inner’},默認(rèn)inner
on, right_on, left_on :對(duì)應(yīng)的分別為連接鍵、右連接鍵、左連接鍵
sort:對(duì)連接鍵進(jìn)行排序
join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False)
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,keys=None, levels=None, names=None, verify_integrity=False, copy=True)
df_3 = pd.DataFrame({"name":["小蘭","小民","小民","小紅","小紅","小紅","小新"],
"course":["math","manth","physics","math","physics","English","math"],
"score":[80,90,89,98,76,85,92]})
df_2.merge(df_3,on="name")
輸出:

數(shù)組匯總
groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, observed=False, **kwargs)
df_3.groupby(["name"]).mean() #計(jì)算每人的平均分
數(shù)據(jù)透視
pivot_table(values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')
pivt_table可以參考excel的數(shù)據(jù)透視表,values為透視的值,index為透視行,columns為透視列,aggfunc為值計(jì)算函數(shù),fill_value對(duì)nan值的填充
pd.pivot_table(df_3,values = "score", index="name",columns="course",fill_value=0)

增加計(jì)算列
需要去列進(jìn)行新增計(jì)算列時(shí),可以用assign函數(shù)
assign(**kwargs)
**kwargs為可調(diào)用的列
#所有學(xué)生分?jǐn)?shù)按80%計(jì)算
df_3.assign(score80 = lambda x: x.score*0.8)
df_3.assign(score80 = df_3["score"]*0.8)
以上輸出一樣:

assign函數(shù)還能直接對(duì)新生成的列計(jì)算
df_3.assign(score80 = lambda x: x.score*0.8,score50 = lambda x: x["score80"]*0.5)

以上就是pandas的一些總結(jié)教程,后續(xù)介紹pandas在時(shí)間日期的應(yīng)用,pandas在日期時(shí)間處理上十分方便。