pandas 學習 第10篇:DataFrame 數據處理(應用、追加、截斷、鏈接、合併、重複值、重索引、重命名、重置索引、設置軸索引、選擇和過濾)

DataFrame的這些操做和Series很類似,這裏簡單介紹一下。html

一,應用

apply()函數應用於軸級別,applymap應用於元素級別:正則表達式

DataFrame.apply(self, func, axis=0, raw=False, result_type=None, args=(), **kwds)
DataFrame.applymap(self, func)

定義一個函數fun,使用apply()函數把fun應用到由DataFrame對象的列構成的一維數組上,一般fun函數是由聚合函數構成的。數據庫

f=lambda x: x.max()-x.min
df.apply(f)

定義一個函數foo,使用applymap()函數把函數foo應用於DataFrame對象的各個元素上,數組

foo=lambda x: '%.2f' % x

df.applymap(foo)

轉換數據,調用函數對循環對數據元素進行處理:app

DataFrame.transform(self, func, axis=0, *args, **kwargs)

二,追加和截斷數據行

追加是增長數據框的數據,截斷是把數據從數據框中刪除。函數

1,追加spa

向數據框的末尾追加數據行:rest

DataFrame.append(self, other, ignore_index=False, verify_integrity=False, sort=None)

也就是把一個結構相同的DataFrame追加到另外一個DataFrame的後面,把兩個DataFrame合併爲一個。code

2,截斷orm

能夠按照行索引來截斷數據,也能夠按照列索引來截斷數據:

DataFrame.truncate(self, before=None, after=None, axis=None, copy=True)

參數註釋:

  • before:把before以前的索引值截斷
  • after:把after以後的索引值截斷
  • axis:{0 or ‘index’, 1 or ‘columns’}

三,鏈接

數據框的鏈接操做相似於關係型數據庫中的JOIN操做。

1,天然鏈接

兩個數據框按照on條件進行鏈接,或按照索引,或按照同名的字段進行鏈接,按照等值條件進行匹配:

DataFrame.join(self, other, on=None, how='left', lsuffix='', rsuffix='', sort=False)

參數註釋:

  • on:若是設置爲None,那麼按照行索引來匹配;若是設置爲列值,那麼兩個DataFrame中按照on指定的列進行匹配
  • how:鏈接的類型,{‘left’, ‘right’, ‘outer’, ‘inner’}, default ‘left’
  • lsuffix:左表同名字段的前綴
  • rsuffix:右表同名字段的前綴

2,合併

相似於關係型數據庫的鏈接操做,和join函數的功能相同,按照等值條件進行匹配,可是用法比join函數更靈活:

DataFrame.merge(self, 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)

參數註釋:

  • right:右表
  • how:{‘left’, ‘right’, ‘outer’, ‘inner’}, default ‘inner’
  • on:鏈接的條件,要求按照同名字段進行匹配
  • left_on、right_on:分別指定左表和右表的來鏈接字段,字段的順序是有意義的
  • left_index、right_index:分別指定左表和右表的索引,按照索引來匹配
  • suffixes:元組(str,str),分別用於指定左表和右表同名字段的前綴
  • indicator:增長指示器,若是設置爲True,增長一列」_merge「
  • validate:檢查merge的類型(「one_to_one」 or 「1:1」,「one_to_many」 or 「1:m」,「many_to_one」 or 「m:1」和「many_to_many」 or 「m:m」)

四,重複值

重複值是指同一列中重複出現的值。

1,檢測重複值

函數duplicated用於檢測DataFrame的列中是否存在重複值,

DataFrame.duplicated(self, subset=None, keep='first')

subset:列標籤,或列標籤序列

keep:有效值是‘first’, ‘last’, False, default ‘first’

  • first表示除了第一次以外,把後面出現的重複值標記爲True
  • last表示除了最後一次以外,把前面出現的重複值標記爲True
  • False表示把重複值都標記爲True

2,刪除重複值

drop_duplicates()刪除包含重複值的數據行

DataFrame.drop_duplicates(self, subset=None, keep='first', inplace=False)

subset:列標籤,或列標籤序列

keep:有效值是‘first’, ‘last’, False, default ‘first’

  • first表示除了第一次以外,把後面出現的重複值都刪除
  • last表示除了最後一次以外,把前面出現的重複值都刪除
  • False表示把重複值都刪除

五,重索引

 重索引的目的是使原始索引按照新的索引進行排序

DataFrame.reindex(self, labels=None, index=None, columns=None, axis=None, method=None, copy=True, level=None, fill_value=nan, limit=None, tolerance=None)

參數註釋:

  • labels:array-like,新的軸(axis)標籤,軸由參數axis指定
  • index,columns:新索引,若是指定index參數,等價於指定labels和axis=0/'index',若是指定columns,等價於指定labels和axis=1/'columns'
  • axis:軸,axis=0/'index'表示行,axis=1/'columns'表示列
  • method:用於填充的方法,有效值是None, ‘backfill’/’bfill’, ‘pad’/’ffill’, ‘nearest’,
    •   None表示不會填充
    •   ‘backfill’/’bfill’:表示回填,用NA的後面第一個有效值來填充當前的NA
    •   ‘pad’/’ffill’:表示補填,用前面第一個有效值來填充當前的NA
    •   ‘nearest’:用最接近NA的有效值來填充當前的NA
  • copy:默認值是True,返回新的對象
  • level:用於MultiIndex,在一個級別上,與MultiIndex進行匹配。
  • fill_value:標量值,默認值是np.NaN,用於對缺失值進行填充的值
  • limit:填充的最大次數
  • tolerance:可選參數,表示不能徹底匹配的原始標籤和新標籤之間的最大距離,匹配位置處的索引值知足:abs(index_position -  target_position)<= tolerance,容差能夠是標量值(對全部序列值應用相同的容差),也能夠是list-like結構(對每一個序列元素應用可變容差),list-like結構包括列表、元組、數組和序列,而且list-like結構的長度和序列的長度和長度必須相同。

六,重命名

重命名軸的標籤和軸的name屬性

1,重名軸的標籤

重命名軸的標籤,傳遞的參數是dict-like對象,key和value是1-to-1的,key表示原始標籤,value表示新標籤:

DataFrame.rename(self, mapper=None, index=None, columns=None, axis=None, copy=True, inplace=False, level=None, errors='ignore')

參數註釋:

  • mapper:dict-like或函數,用於表示軸標籤和新標籤的映射,由參數axis來表示重命名哪一個軸標籤
  • axis:軸,axis=0/'index'表示行,axis=1/'columns'表示列
  • index:dick-like或函數,用於表示行標籤和新標籤的映射,等價於  axis=0/'index'  和指定mapper參數
  • columns:dick-like或函數,用於表示行標籤和新標籤的映射,等價於  axis=1/'columns'  和指定mapper參數
  • level:指定MultiIndex的特定級別(level)

2,重命名軸的name屬性

軸有name屬性,使用rename_axis()重命名軸的name屬性:

DataFrame.rename_axis(self, mapper=None, index=None, columns=None, axis=None, copy=True, inplace=False)

參數註釋:

mapper:一般狀況下是標籤紙,表示軸的新name

七,重置索引

 重置索引,默認使用整數索引代替原始索引:

DataFrame.reset_index(self, level=None, drop=False, inplace=False, col_level=0, col_fill='')

參數註釋:

  • level:只移除給定level的索引,默認值是移除全部索引。當drop=False時,表示把給定level的索引轉換爲列;當drop=True,把給定的索引從DataFrame對象中刪除。
  • drop:默認值是False,不刪除原始索引,而是把索引插入到DataFrame中,做爲一個列。若是設置爲True,刪除原始索引。
  • col_level:若是columns有多個級別(multiple levels),肯定把標籤插入到哪一個級別,默認插入第一級。
  • col_fill:若是columns有多個級別(multiple levels),肯定其餘級別如何命名。

 例如,建立多級的行索引和列索引,以下所示,行索引是2級別的,兩個級別的名稱分別是class和name;列索引也是2級的,列索引兩個級別都是匿名的。

>>> index = pd.MultiIndex.from_tuples([('bird', 'falcon'),
...                                    ('bird', 'parrot'),
...                                    ('mammal', 'lion'),
...                                    ('mammal', 'monkey')],
...                                   names=['class', 'name'])
>>> columns = pd.MultiIndex.from_tuples([('speed', 'max'),
...                                      ('species', 'type')])
>>> df = pd.DataFrame([(389.0, 'fly'),
...                    ( 24.0, 'fly'),
...                    ( 80.5, 'run'),
...                    (np.nan, 'jump')],
...                   index=index,
...                   columns=columns)
>>> df
               speed species
                 max    type
class  name
bird   falcon  389.0     fly
       parrot   24.0     fly
mammal lion     80.5     run
       monkey    NaN    jump

把class級別的行索引轉換爲列,插入到列索引的級別1中:

>>> df.reset_index(level='class', drop=False, col_level=1)
                speed species
         class    max    type
name
falcon    bird  389.0     fly
parrot    bird   24.0     fly
lion    mammal   80.5     run
monkey  mammal    NaN    jump

查看DataFrame的多級列,新插入的列'Class'在另外一個level上是沒有列名的,這能夠經過設置col_fill參數來爲另外一個level上的列名賦值:

>>> df.reset_index(level='class', drop=False, col_level=1).columns
MultiIndex([(       '', 'class'),
            (  'speed',   'max'),
            ('species',  'type')],
           )

修改新加的列在其餘level的列名:

>>> df.reset_index(level='class', col_level=1, col_fill='genus')
                genus  speed species
                class    max    type
name
falcon           bird  389.0     fly
parrot           bird   24.0     fly
lion           mammal   80.5     run
monkey         mammal    NaN    jump

8、設置軸的索引

設置軸的索引,可使用set_index()函數把已有的列轉換爲行索引,也可使用set_axis()函數替換掉已有的軸索引。

1,把已有的列轉換爲行索引

使用現有的列做爲DataFrame的索引:

DataFrame.set_index(self, keys, drop=True, append=False, inplace=False, verify_integrity=False)

參數註釋:

  • keys:列標籤,或列標籤的列表,
  • drop:默認值是True,表示刪除keys參數指定的列;設置爲False,表示不刪除keys參數指定的列。
  • append:默認值是False,表示刪除原始行索引;若是設置爲True,表示向現有的行索引中追加索引。
  • verify_integrity:默認值是False,不檢查新索引是否存在重複值。

2,替換原始索引 

把給定的軸的索引替換爲新索引:

DataFrame.set_axis(self, labels, axis=0, inplace=None)

參數註釋:

  • labels:新索引的值
  • axis:{0 or ‘index’, 1 or ‘columns’}, default 0,指定用於更新的軸
  • inplace:是否原地更新

使用新的索引來替換原始的行索引:

>>> df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})
>>> df.set_axis(['a', 'b', 'c'], axis='index', inplace=False)
   A  B
a  1  4
b  2  5
c  3  6

九,選擇和過濾

選擇是指經過軸索引來選擇數據,而過濾是指按照軸標籤(徹底匹配、模糊匹配和正則匹配)來過濾數據。

1,選擇

選擇Top N行、尾部N行、或者從給定的位置處返回數據:

DataFrame.head(self, n=5)
DataFrame.tail(self, n=5)
DataFrame.take(self, indices, axis=0, is_copy=True, **kwargs)

舉個例子,返回從行索引爲0和3的數據行:

df.take([0, 3])

2,過濾

也可使用正則表達式、模糊匹配等方式,從數據框的軸標籤中匹配值,返回數據:

DataFrame.filter(self, items=None, like=None, regex=None, axis=None)

參數註釋:

  • items:指定軸標籤,返回特定索引值的軸
  • axis:指定軸是行仍是列,默認值None是指'columns',從列中過濾值。若是axis是'index',那麼返回的是序列;若是axis是'columns',那麼返回的是數據框。
  • like:軸標籤模糊匹配
  • regex:使用正則表達式來匹配軸標籤

 

 

參考文檔:

pandas DataFrame

相關文章
相關標籤/搜索