pandas 學習 第6篇:DataFrame - 數據處理(長寬格式、透視表)


長寬格式的轉換

寬格式是指:一列或多列作為標識變量(id_vars),其他變量作為度量變量(value_vars),直觀上看,這種格式的數據比較寬,舉個列子,列名是:id1、id2、var1、var2、var3,一行可以表示多個度量變量的值。

而長格式是指在一行中,除了標識變量(id_vars),其他列是variable和name,從寬格式轉換為長格式,會使得數據行數增加,直觀上看,這種格式的數據比較長,舉個例子,列名是:id1、id2、variable、value,一行只表示一個度量變量的值。

在寬格式轉換為長格式的過程中,寬格式中的多個度量變量進行了分裂,使得長格式中的每一行,實際上,只表示一個度量變量的值。

有如下寬數據:

>>> df = pd.DataFrame({'idA': {0: 'a', 1: 'b', 2: 'c'},
...                    'varB': {0: 1, 1: 3, 2: 5},
...                    'varC': {0: 2, 1: 4, 2: 6}})
>>> df
  idA  varB  varC
0   a     1     2
1   b     3     4
2   c     5     6

1,融合數據(melt)

把數據從寬格式轉換為長格式

DataFrame.melt(self, id_vars=None, value_vars=None, var_name=None, value_name='value', col_level=None)

參數注釋:

  • id_vars:作為標識變量的列
  • value_vars:作為值的列
  • var_name:默認值是variable,對長格式中度量變量的列名所在的列進行命名
  • value_name:默認值是value,對長格式中度量變量的列值所在的列進行命名
  • col_level:如果列是MultiIndex,使用這個level的索引進行melt

舉個例子,把示例中的寬數據轉換為長數據,id列是idA,度量變量是varB,得到如下長數據:

>>> df.melt(id_vars='idA',value_vars='varB')
  idA variable  value
0   a     varB      1
1   b     varB      3
2   c     varB      5

id列是idA,度量變量是varB和varC,得到如下長數據:

>>> df.melt(id_vars='idA',value_vars=['varB','varC'])
  idA variable  value
0   a     varB      1
1   b     varB      3
2   c     varB      5
3   a     varC      2
4   b     varC      4
5   c     varC      6

2,重塑數據(pivot)

把數據從長格式轉換為寬格式,返回按照特定的index或column重塑的DataFrame:

DataFrame.pivot(self, index=None, columns=None, values=None)

參數注釋:

  • index:用於創建新DataFrame的索引,相當於分組列,相同索引的行稱為一個小分組。
  • columns:根據columns指定的列值來創建新DataFame的列名,使用該參數指定的列來創建結果的列名。
  • values:和columns對應,表示相應列的列值,用於填充結果列的列值

重塑數據的流程:

  • 根據index的唯一值進行分組,
  • 把columns指定的列的唯一值作為結果的列名,即,列的值作為結果的列名
  • 把values對應的列值作為新列名的值,即,把列的值作為結果中對應列的值

舉個例子,有如下長格式的數據:

>>> df=df.melt(id_vars='idA',value_vars=['varB','varC'])
>>> df
  idA variable  value
0   a     varB      1
1   b     varB      3
2   c     varB      5
3   a     varC      2
4   b     varC      4
5   c     varC      6

使用pivot把長格式轉換為寬格式,按照idA列進行分組,把variable的列值作為結果的列名,把values的列值作為結果列的值:

>>> df.pivot(values='value',columns='variable',index='idA')
variable  varB  varC
idA                 
a            1     2
b            3     4
c            5     6

重塑的數據包含行索引idA,列標簽varB和varC,其中variable是列標簽的name。

使用reset_index()函數把行索引轉換為列,其中variable是列索引的名稱:

>>> df.pivot(values='value',columns='variable',index='idA').reset_index()
variable idA  varB  varC
0          a     1     2
1          b     3     4
2          c     5     6

透視表(pivot_table)

透視表是指按照特定的index和columns進行聚合操作之后的表,該函數和pivot函數的行為相似,只不過會對值進行聚合操作:

DataFrame.pivot_table(self, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All', observed=False)

參數注釋:

  • values:聚合的列
  • index:分組器,作為結果的索引
  • columns:分組器,作為結果的列
  • aggfunc:聚合的函數
  • fill_value:用於填充缺失值的值
  • margins:bool,默認值是True,把所有行或列的值加和,計算subtotal(小組和)或grand total(總合)
  • margins_name:str,默認值是All,當margins為Ture時,為每個匯總設置名稱。
  • observed:boolean, default False,僅適用於分組器是分類索引的。

例如,對長數據進行重塑,獲得透視表:

>>> df.pivot_table(values='value',index='idA',columns='variable',aggfunc='mean')
variable  varB  varC
idA                 
a            1     2
b            3     4
c            5     6

 

 

 

參考文檔:

pandas DataFrame


免責聲明!

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



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