Pandas -----簡述 Series和DataFrame


 
import pandas as pd #Series 和 DataFrame 都是 Pandas庫的數據結構,使用前要導入
一、 Series 簡述、創建
 
  1. Series簡述和創建 
  •         簡述    
        Series 可以理解為一維數組, 其一個索引index對應一個值values; 也可以看做是定長的有序字典
         
  •         創建   
S = pd.Series(data, index= index)
            其中data數據類型可以有:  python dict 、numpy數組和常量
    
              A. python dict
                dict 的key做索引, values做索引對應的值
               B.  numpy
 
                C. 常量
 
  1. 操作:
            
  • 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
  1. 簡述和創建
  •  簡述:
            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也有,只是改了一些。
  1. 操作
 
  • 索引
  #返回一個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參數,根據一個或者多個列的值排序

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM