長寬格式的轉換
寬格式是指:一列或多列作為標識變量(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
參考文檔: