### 一.建立對象
#
1
.能夠經過傳遞一個list對象來建立一個Series,pandas會默認建立整型索引:
# s=pd.Series([
1
,
3
,
5
,np.nan,
6
,
8
])
# print(s)
#
#
2
.經過傳遞一個numpy array,時間索引以及列標籤來建立一個DataFrame:
# dates=pd.date_range(
'20130101'
,periods=
6
)
# print(dates)
# df=pd.DataFrame(np.random.randn(
6
,
4
),index=dates,columns=list(
'ABCD'
))
# print(df)
#
#
3
.經過傳遞一個可以被轉換成相似序列結構的字典對象來建立一個DataFrame:
# df2=pd.DataFrame({
'A'
:
1
,
'B'
:pd.Timestamp(
'20130102'
),
#
'C'
:pd.Series(
1
,index=list(range(
4
)),dtype=
'float32'
),
#
'D'
:np.array([
3
]*
4
,dtype=
'int32'
),
#
'E'
:pd.Categorical([
'test'
,
'train'
,
'test'
,
'train'
]),
#
'F'
:
'fool'
# })
# print(df2)
#
4
.查看不一樣列的數據類型:
# print(df2.dtypes)
#
#
### 二.查看數據
#
1
.查看frame中頭部和尾部的行:
# print(df.head(
1
))
# print(df.tail(
1
))
#
#
2
.顯示索引、列和底層的numpy數據:
# print(df.index)
# print(df.columns)
# print(df.values)
#
#
3
.describe()函數對於數據的快速統計彙總:
# print(df.describe())
#
#
4
.對數據的轉置:
# print(df.T)
#
#
5
.按軸進行排序
#print(df.sort_index(axis=
1
,ascending=False))
#
#
6
.按值進行排序
# print(df.sort(columns=
'B'
))
#
#
### 三.選擇
# NO1.獲取
#
1
. 選擇一個單獨的列,這將會返回一個Series,等同於df.A:
# print(df[
'A'
])
#
#
2
.經過[]進行選擇,這將會對行進行切片
# print(df[:
3
]) # 其中
0
能夠省略 print(df[
0
:
3
])
#
# NO2.經過標籤選擇
#
1
.使用標籤來獲取一個交叉的區域
# print(df.loc[dates[
0
]])
#
#
2
.經過標籤來在多個軸上進行選擇
# print(df.loc[:,[
'A'
,
'B'
]])
#
#
3
.標籤切片
# print(df.loc[
'20130102'
:
'20130104'
,[
'A'
,
'B'
]])
#
#
4
.對於返回的對象進行維度縮減
# print(df.loc[
'20130101'
,[
'A'
,
'B'
]])
#
#
5
.獲取一個標量
# print(df.loc[dates[
0
],
'A'
])
#
#
6
.快速訪問一個標量(與上一個方法等價)
# print(df.at[dates[
0
],
'A'
])
#
# NO3.經過位置選擇
#
1
.經過傳遞數值進行位置選擇(選擇的是行)
# print(df.iloc[
3
])
#
#
2
.經過數值進行切片,與numpy/python中的狀況相似
# print(df.iloc[
3
:
5
,
0
:
2
])
#
#
3
.經過指定一個位置的列表,與numpy/python中的狀況相似
# print(df.iloc[[
1
,
2
,
4
],[
0
,
2
]])
#
4
.對行進行切片
# print(df.iloc[
1
:
3
,:])
#
#
5
.對列進行切片
# print(df.iloc[:,
1
:
3
])
#
#
6
.獲取特定的值
# print(df.iloc[
1
,
1
])
#
# NO4.布爾索引
#
1
.使用一個單獨列的值來選擇數據:
# print(df[df.A>
0
])
#
#
2
.使用where操做來選擇數據:
# print(df[df>
0
])
#
#
3
.使用isin()方法來過濾:
# df2=df.copy()
# df2[
'E'
]=[
'one'
,
'one'
,
'one'
,
'one'
,
'one'
,
'two'
]
# print(df2)
#
# NO5.設置
#
1
.設置一個新的列:
# s1=pd.Series([
1
,
2
,
3
,
4
,
5
,
6
],index=pd.date_range(
'20130101'
, periods=
6
))
# print(s1)
# df[
'F'
]=s1
# print(df)
#
#
2
.經過標籤設置新的值:
# df.at[dates[
0
],
'A'
]=
0
# print(df)
#
#
3
.經過位置設置新的值:
# df.iat[
0
,
1
]=
0
# print(df)
#
#
4
.經過一個numpy數組設置一組新值:
# df.loc[:,
'D'
]=np.array([
5
]*len(df))
# print(df)
#
#
5
.經過where操做來設置新的值:
# df2=df.copy()
# df2[df2>
0
]=-df2
# print(df2)
#
#
### 四.缺失值處理
# 在pandas中,使用np.nan來代替缺失值,這些值將默認不會包含在計算中,詳情請參閱:Missing Data Section。
#
#
1
.reindex()方法能夠對指定軸上的索引進行改變/增長/刪除操做,這將返回原始數據的一個拷貝:、
#
# df1=df.reindex(index=dates[
0
:
4
],columns=list(df.columns)+[
'E'
])
# print(df1)
#
#
2
.去掉包含缺失值的行:
# df1.dropna(how=
'any'
,inplace=True)
# print(df1)
#
#
3
.對缺失值進行填充:
# df1=df1.fillna(value=
5
)
# print(df1)
#
#
4
.對數據進行布爾填充:
# print(pd.isnull(df1))
#
#
### 五.相關操做
# 詳情請參與 Basic Section On Binary Ops
#
# NO1.統計(相關操做一般狀況下不包括缺失值)
#
1
.執行描述性統計:
# print(df.mean())
#
#
2
.在其餘軸上進行相同的操做:
# print(df.mean(
1
))
#
#
3
.對於擁有不一樣維度,須要對齊的對象進行操做。Pandas會自動的沿着指定的維度進行廣播:
# s=pd.Series([
1
,
3
,
5
,np.nan,
6
,
8
],index=dates).shift(
2
)
# print(s)
#
# NO2.Apply
#
1
.對數據應用函數:
# print(df.apply(np.cumsum))
# print(df.apply(lambda x:x.max()-x.min()))
#
# NO3.直方圖
# 具體請參照:Histogramming and Discretization
#
# s=pd.Series(np.random.randint(
0
,
7
,size=
10
))
# print(s)
# print(s.value_counts())
#
# NO4.字符串方法
# Series對象在其str屬性中配備了一組字符串處理方法,能夠很容易的應用到數組中的每一個元素
# s=pd.Series([
'A'
,
'B'
,
'C'
,
'Bcaa'
,np.nan,
'CBA'
,
'dog'
,
'cat'
])
# print(s.str.lower())
#
#
### 六.合併
# Pandas提供了大量的方法可以輕鬆的對Series,DataFrame和Panel對象進行各類符合各類邏輯關係的合併操做。具體請參閱:Merging section
#
# NO1.Concat
# df=pd.DataFrame(np.random.randn(
10
,
4
))
# print(df)
# pieces=[df[:
3
],df[
3
:
7
],df[
7
:]]
# print(pd.concat(pieces))
#
# NO2.Join 相似於SQL類型的合併
# left=pd.DataFrame({
'key'
:[
'foo'
,
'foo'
],
'lval'
:[
1
,
2
]})
# right=pd.DataFrame({
'key'
:[
'foo'
,
'foo'
],
'rval'
:[
4
,
5
]})
#
# print(left)
# print(right)
#
# mid=pd.merge(left,right,on=
'key'
)
# print(mid)
#
# NO3.Append 將一行鏈接到一個DataFrame上
# df=pd.DataFrame(np.random.randn(
8
,
4
),columns=[
'A'
,
'B'
,
'C'
,
'D'
])
# print(df)
# s=df.iloc[
3
]
# print(s)
# df=df.append(s,ignore_index=True)
# print(df)
#
#
### 七.分組
# 對於」group by」操做,咱們一般是指如下一個或多個操做步驟:
#
# NO1.(Splitting)按照一些規則將數據分爲不一樣的組;
#
# NO2.(Applying)對於每組數據分別執行一個函數;
#
# NO3.(Combining)將結果組合到一個數據結構中;
#
# df=pd.DataFrame({
'A'
:[
'foo'
,
'bar'
,
'foo'
,
'bar'
,
'foo'
,
'bar'
,
'foo'
,
'bar'
]
# ,
'B'
:[
'one'
,
'two'
,
'two'
,
'one'
,
'one'
,
'two'
,
'one'
,
'two'
]
# ,
'C'
:np.random.randn(
8
),
'D'
:np.random.randn(
8
)})
# print(df)
#
#
1
.分組並對每一個分組執行sum函數:
# print(df.groupby(
'A'
).sum())
#
#
2
.經過多個列進行分組造成一個層次索引,而後執行函數:
# print(df.groupby([
'A'
,
'B'
]).sum())
#
### 八.Reshaping
# NO1.Stack
# tuples=list(zip(*[[
'bar'
,
'bar'
,
'baz'
,
'baz'
,
'foo'
,
'foo'
,
'qux'
,
'qux'
]
# ,[
'one'
,
'two'
,
'one'
,
'two'
,
'one'
,
'two'
,
'one'
,
'two'
]]))
#
# index=pd.MultiIndex.from_tuples(tuples, names=[
'first'
,
'second'
])
# df=pd.DataFrame(np.random.randn(
8
,
2
),index=index,columns=[
'A'
,
'B'
])
# df2=df[:
4
]
# print(df2)
# print(df2.stack().unstack(
1
))
#
#
### 九.時間序列
# Pandas在對頻率轉換進行從新採樣時擁有簡單、強大且高效的功能(如將按秒採樣的數據轉換爲按
5
分鐘爲單位進行採樣的數據)
# rng=pd.date_range(
'1/1/2012'
,periods=
100
,freq=
'S'
)
# print(rng)
# ts=pd.Series(np.random.randint(
0
,
500
,len(rng)),index=rng)
# print(ts)
# print(ts.resample(
'5Min'
,how=
'sum'
))
#
#
1
.時區表示:
# rng=pd.date_range(
'3/6/2012 00:00'
,periods=
5
,freq=
'D'
)
# print(rng)
# ts=pd.Series(np.random.randn(len(rng)),index=rng)
# print(ts)
# ts_utc=ts.tz_localize(
'UTC'
)
# print(ts_utc)
#
#
2
.時區轉換:
# print(ts_utc.tz_convert(
'US/Eastern'
))
#
#
3
.時間跨度轉換:
# rng=pd.date_range(
'1/1/2012'
,periods=
5
,freq=
'M'
)
# print(rng)
# ts=pd.Series(np.random.randn(len(rng)),index=rng)
# print(ts)
# ps=ts.to_period()
# print(ps)
# print(ps.to_timestamp())
#
#
4
.時期和時間戳之間的轉換使得可使用一些方便的算術函數。
# prng=pd.period_range(
'1990Q1'
,
'2000Q4'
,freq=
'Q-NOV'
)
# print(prng)
# ts=pd.Series(np.random.randn(len(prng)),index=prng)
# print(ts)
# ts.index=(prng.asfreq(
'M'
,
'e'
)+
1
).asfreq(
'H'
,
's'
)+
8
# print(ts.head())
#
#
### 十.Categorical
# 從
0.15
版本開始,pandas能夠在DataFrame中支持Categorical類型的數據
#
# df=pd.DataFrame({
'id'
:[
1
,
2
,
3
,
4
,
5
,
6
],
'raw_grade'
:[
'a'
,
'b'
,
'b'
,
'a'
,
'a'
,
'e'
]})
# print(df)
#
#
1
.將原始的grade轉換爲Categorical數據類型:
# df[
'grade'
]=df[
'raw_grade'
].astype(
'category'
)
# print(df)
#
#
2
.將Categorical類型數據重命名爲更有意義的名稱:
# df[
'grade'
].cat.categories=[
'very good'
,
'good'
,
'very bad'
]
# print(df)
#
#
3
.對類別進行從新排序,增長缺失的類別:
# df[
'grade'
]=df[
'grade'
].cat.set_categories([
'very bad'
,
'bad'
,
'medium'
,
'good'
,
'very good'
])
# print(df[
'grade'
])
#
#
4
.排序是按照Categorical的順序進行的而不是按照字典順序進行:
# print(df.sort(
'grade'
))
#
#
5
.對Categorical列進行排序時存在空的類別:
# print(df.groupby(
'grade'
).size())
#
#
### 十一.畫圖
# ts=pd.Series(np.random.randn(
1000
),index=pd.date_range(
'1/1/2012'
,periods=
1000
,freq=
'D'
))
# ts=ts.cumsum()
# ts.plot()
#
# df=pd.DataFrame(np.random.randn(
1000
,
4
),index=ts.index,columns=[
'A'
,
'B'
,
'C'
,
'D'
])
# df=df.cumsum()
# plt.figure();df.plot();plt.legend(loc=
'best'
)
#
#
### 十二.導入和保存數據
# NO1.CSV
#
1
.寫入csv文件:
# df.to_csv(
'jeramy.csv'
,index=False)
#
#
2
.從csv文件中讀取:
# pd.read_csv(
'jeramy.csv'
)
#
# NO2.EXCEL
#
1
.寫入excel文件:
# df.to_excel(
'jeramy.xlsx'
,sheet_name=
'Sheet1'
)
#
#
2
.從excel文件中讀取:
# pd.read_excel(
'jeramy.xlsx'
,
'Sheet1'
,index_col=None,na_values=[
'NA'
])