import pandas as pd #Series 和 DataFrame 都是 Pandas庫的數據結構,使用前要導入
一、 Series 簡述、創建
-
Series簡述和創建
-
簡述
Series 可以理解為一維數組, 其一個索引index對應一個值values; 也可以看做是定長的有序字典
-
創建
S = pd.Series(data, index= index)
其中data數據類型可以有: python dict 、numpy數組和常量
A. python dict
dict 的key做索引, values做索引對應的值
B. numpy
C. 常量
-
操作:
-
Series部分屬性
index和values屬性
import pandas as pd data = ['jordan', 'james', 'kobe'] se1 = pd.Series(data, index=range(3)) print se1.index print se1.values
name屬性, 索引的name屬性
se1.name = 'rank_number' se1.index.name = 'num' se1.index = ['No1', 'No.2', 'No.3'] #修改索引

-
Series部分方法
pd.isnull() # 檢查是額否有NaN(缺失值),返回一個Series,數據為boolean

# 排序: pd.Series.sort_index() # 按照索引排序 pd.Series.order() # 按 值 排序, 有任何缺失值時,放到Series尾部
-
索引、切片
se2 = pd.Series(np.arange(5), index = list('apple')) se2['p'] # 索引, 索引值為'p'的都會列出來 se2['a':'l'] # 切片, 與Python和numpy切片不同, Series “非數值” 切片是 “包前又包后的”(滿嘴順口溜也考不上研!!Doge) se2[: 3] #切片, 通過數值切片依舊是 “包前不包后”

-
重新索引
Series的reindex方法重新索引, 由下圖看出來reindex方法是復制了原始的Series,並沒有改變原始數據
se1 = pd.Series(['a', 'aa', 'aaa'], index=[1,2,3]) se1.reindex([1,2,3,4]) # 當索引對應的數據為空時,默認NaN填充 se1.reindex(['1','2','3','4']) # 當改變索引的數據類型時 int -> string 時,對應數據也會改變 se1.reindex([1,2,3,4],fill_value=0) # fill_values參數,設置缺失值 # 還有幾種缺失值填充的參數: # ffill / pad # 向前填充/搬運 值 # bfill / backfill # 向后填充/搬運 值


二、DataFrame
-
簡述和創建
-
簡述:
DataFrame是一種含有行索引、列索引的表格類型的數據結構, 其每列都是不同的值類型。
-
創建:
A. 單層字典創建:
import pandas as pd play_info = { "name": ['jordan', 'james', 'kobe', 'johnson', 'shark'], 'club': ['Bulls', 'Heat', 'Lakers', 'Lakers', 'Lakers'], 'position':['sg', 'sf', 'sg', 'pg', 'c'], 'number': ['23', '6', '24', '32', '33'] } p_df = pd.DataFrame(play_info) # 未指定index行索引,默認添加有序索引; 如果沒有指定column列索,那么列序是隨機。如下圖所示; # 若創建DataFrame時, play_info 中的數據有缺失值, 會自動使用NaN填充,這就不舉例了 print p_df p_df = pd.DataFrame(play_info, columns=['name', 'number', 'club', 'position']) # 指定列索引columns順序 p_df = pd.DataFrame(play_info, columns=['name', 'number', 'club', 'position'], index=['one', 'two', 'three', 'four', 'five']) #顯示指定行索引
B. 嵌套字典創建:
data2 = { 'nevada' : { 2001 : 2.4, 2002 : 2.9 }, 'ohio':{ 2000 : 1.5, 2001 : 1.7, 2002 : 3.6 } } df1 = pd.DataFrame(data2) # 嵌套字典創建,沒有顯示指定index時, 內層字典 的key 會被合並、排序 print df1

C. 先創建DataFrame數據,再使用 index和columns屬性指定
DataFrame.index = [] # 增加行索引 / 修改行索引 DataFrame.columns = [] # 增加列索引 / 修改列索引 (如下圖就是修改行、列索引)

-
屬性:
name屬性
df.index.name = df.columns.name = df.values # 返回 DataFrema的數據為 ndarray類型
-
DataFrame() 構造函數可以接收的數據類型
2nd- array | 數據矩陣 |
數組、列表和元組組成的字典 |
字典每個key在DataFrame中為一列
|
numpy的結構化數組 |
類似“數組組成的字典”
|
Series組成的字典
|
每個Series在DataFrame中為一列,未顯示之指定索引,會合並
|
字典組成的字典(嵌套字典, 如上例所示)
|
每個內層字典成為一列,內層字典的key被合並,行列索引未指定則合並 |
字典或Series的列表
|
各項成一行。 字典key/ series索引的並集 成為DataFrame 的 columns
|
由列表/元組組成的列表
|
類似 2nd-array |
另一個 DataFram
|
該DataFrame 的index未顯示指定時, 沿用
|
Numpy的 MaskedArray
|
類似 2nd-array, 只是掩碼值在結果DataFrame中成為缺失值 NaN
|
上述表格在《利用Python進行數據分析》P123頁也有,我只是改了一部分(按我的理解)
-
索引對象
DataFrame的索引對象不支持修改,保證了多個數據結構之間的安全共享

index對象還有多個
Index
廣義的Index,由Python object組成的numpy數組
|
Int64Index
整數數組特殊的Index
|
MultiIndex
“層次化”索引對象
|
DatetimeIndex
時間戳,Numpy的datetime類型表示
|
PeriodIndex
時間間隔數據的特殊Index
|
注:上述表格《利用Python進行數據分析》P125也有,只是改了一些。
-
操作
-
索引
#返回一個Series p_df['name'] # 如下第一個圖 #如下圖2 DataFrame.iloc[int_num] # 行索引數據類型為 int 時,使用iloc 。 int_num為索引整數值 (基於數字) DataFrame.loc['str'] # 列索引數據類型為 string 時,使用loc。 str為索引具體的值 (基於字符串) #如下圖3 DataFrame.ix[[rows_index], [col_index]] # ix 基於標簽索引,
索引其他方法
reindex方法 |
1/多個軸匹配到新索引
|
xs方法
|
通過標簽選取單行/單列,返回Series |
icol、irow方法
|
整數位置選取單行/單列,返回Series
|
get_value、set_values
|
根據行標簽、列標簽 選取/設置 單個值
|
注:表格來源於《利用Python進行數據分析》P132~P133的部分內容

圖1


圖2
-
切片與過濾
p_df[:2] p_df[['name', 'age', 'club']] # 多列 p_df[p_df['age'] > 28] # 過濾, p_df 的 ‘age’列大於28的所有整行數據

-
增加列
p_df['age'] = [26, 31, 32, 21, 27] # 順序指定 p_df['country'] = 'usa' # 整體賦值

-
刪除
del p_df['country'] # 刪除列 DataFrame.drop(row_index) # 刪除行,行索引的值為row_index

-
重新索引 與 刪除索引及其行數據
pd.DataFrame().reindex(columns=[]) # reindex函數,傳入 columns 參數值可以完成 列索引的重新索引,這就不舉例了 df2 = pd.DataFrame(np.arange(9).reshape((3,3)), index=['a', 'c', 'd'], columns=['sss', 'aaa','ddd']) df3 = df2.reindex(['a', 'b', 'c', 'd']) print df3 df4 = df3.drop('a') / df4 = df3.drop(['a', 'c']) # 刪除指定的行索引及其對應行數據(傳入list就是多行)
reindex時, 新增索引對應的行沒有對應值,NaN自動填充

-
算術運算、運算中的值填充
DataFrame之間的運算
# 相加有兩種,add函數 和 + df1.add(df2, fill_values=) # add 函數完成運算 , fill_value 參數填充 缺失值 df1 + df2 # 行索引不相同時,相加后,整行都是NaN填充 # 相加后的DataFrame 可以使用 reindex 重新索引 ,fill_value 參數填充 # 其他函數 df.sub # 減法 df.div # 除法 df.mul # 乘法 Series + DataFrame # 注: series 和DataFrame 的數據類型 必須為int!! float和string 無法運算 # dataframe + series 運算本質 可以理解為 ,在DataFrame 中增加一個列,columns中為增加 df11 = pd.DataFrame(np.arange(12).reshape((4,3)), index=list('abcd'),columns=['no1', 'no2', 'no3']) se1 = pd.Series(np.arange(5), index=list('abcde')) add_df_se = df11.T + se1 # series.index 與 DataFrame.columns 存在關系時(子集、交集等),其含義是 在DataFrame 中增加一個列,columns中為增加 add_df_se = df11 + se1 # 如果某個值在DataFrame的列和Series的index中都找不到, 那么運算后的DataFrame 就會別重新索引 且生成並集
-
函數應用和映射
# 其主要是 如何在DataFrame中使用部分函數,如:min 、max、abs等燈
示例:
f = lambda x: x.max() - x.min() # 匿名函數 df11.apply(f) # 默認axis = 0 df11.apply(f, axis=1) # 這里的axis軸,表示行/列, axis = 0 表示列, axis = 1表示行
apply() 表示 沿着軸執行函數操作

-
其他功能
#內置排序 sort_index(self, axis=0, level=None, ascending=True, inplace=False, kind='quicksort', na_position='last', sort_remaining=True, by=None) # 具體參數 help()函數有介紹 , by參數,根據一個或者多個列的值排序