首頁 > 軟體

Pandas資料分析之pandas資料透視表和交叉表

2022-08-12 14:02:33

前言

pandas對資料框也可以像excel一樣進行資料透視表整合之類的操作。主要是針對分類資料進行操作,還可以計算數值型資料,去滿足複雜的分類資料整理的邏輯。

首先還是匯入包:

import numpy as np
import pandas as pd

整理透視 pivot 

首先介紹的是最簡單的整理透視函數pivot,其原理如圖:

pivot引數:

  • index:新 df 的索引列,用於分組,如果為None,則使用現有索引
  • columns:新 df 的列,如果透視後有重複值會報錯
  • values:用於填充 df 的列。 如果未指定,將使用所有剩餘的列,並且結果將具有按層次結構索引的列

用法如下,首先生成案例資料df

df = pd.DataFrame({'foo': ['one', 'one', 'one', 'two', 'two', 'two'],
                   'bar': ['A', 'B', 'C', 'A', 'B', 'C'],
                   'baz': [1, 2, 3, 4, 5, 6],
                   'zoo': ['x', 'y', 'z', 'q', 'w', 't']})
df

df.pivot(index='foo', columns='bar', values='baz')

可以看到是一一對應。簡單來說就是把foo、bar兩個分類變數整到行列名稱上去了,baz作為值

# 多層索引,可以取其中一列
df.pivot(index='foo', columns='bar') #['baz']

# 指定值
df.pivot(index='foo', columns='bar', values=['baz', 'zoo'])

聚合透視 Pivot Table

上面的pivot只適用於一一對應的情況,如果分類變數的組合一樣,但是取值不一樣就會報錯。此時應該用Pivot Table,他預設計算相同情況的均值。

引數:

  • data: 要透視的 DataFrame 物件
  • values: 要聚合的列或者多個列
  • index: 在資料透視表索引上進行分組的鍵
  • columns: 在資料透視表列上進行分組的鍵
  • aggfunc: 用於聚合的函數, 預設是 numpy.mean'''
df = pd.DataFrame({"A": ["a1", "a1", "a1", "a2", "a2","a2"],
                   "B": ["b2", "b2", "b1", "b1", "b1","b1"],
                   "C": ['c1','c1','c2','c2','c1','c1'],
                   "D": [1, 2, 3, 4, 5, 6]})
df

#索引a,列b使用Pivot會報錯,因為他們之間的組合有重複,要用Pivot Table,預設計算均值
pd.pivot_table(df,index='A',columns='B',values='D')

#驗證一下b1,a2這個均值5
df.loc[(df.A=='a2')&(df.B=='b1')].D.mean()

 聚合透視高階操作

pd.pivot_table(df,index=['A','B'],#指定多個索引
               columns=['C'],  #指定列
               values='D', #資料值列
               aggfunc=np.sum, #聚合函數
               fill_value=0, #空值填充
               margins=True  #增加彙總列
              )

 #多個計算方法

pd.pivot_table(df,index=['A','B'],#指定多個索引
               columns=['C'],  #指定列
               values='D', #資料值列
               aggfunc=[np.sum,np.mean,np.std]
              )

交叉表crosstab()

交叉表是用於統計分組頻率的特殊透視表。簡單來說,就是將兩個或者多個列重中不重複的元素組成一個新的 DataFrame,新資料的行和列交叉的部分值為其組合在原資料中的數量

語法結構如下:

pd.crosstab(index, columns, values=None, rownames=None,colnames=None, aggfunc=None, margins=False,
margins_name: str = 'All', dropna: bool = True,normalize=False) #→ 'DataFrame'

引數說明:

index:類陣列,在行中按分組的值。
columns:類陣列的值,用於在列中進行分組。
values:類陣列的,可選的,要根據因素彙總的值陣列。
aggfunc:函數,可選,如果未傳遞任何值陣列,則計算頻率表。
rownames:序列,預設為None,必須與傳遞的行陣列數匹配。
colnames:序列,預設值為None,如果傳遞,則必須與傳遞的列陣列數匹配。
margins:布林值,預設為False,新增行/列邊距(小計)
normalize:布林值,{'all','index','columns'}或{0,1},預設為False。 通過將所有值除以值的總和進行歸一化。'

生成案例資料:

df = pd.DataFrame({"A": ["a1", "a1", "a1", "a2", "a2","a2"],
                   "B": ["b2", "b2", "b1", "b1", "b1","b1"],
                   "C": ['c1','c1','c2','c2','c1','c1'],
                   "D": [1, 2, 3, 4, 5, 6]})
df

pd.crosstab(df['A'],df['B'])  #都是分類資料,計算頻率

pd.crosstab(df['A'],df['C']) #都是分類資料

#對交叉結果進行歸一化:
pd.crosstab(df['A'], df['B'], normalize=True)

#對每列進行歸一化:
pd.crosstab(df['A'], df['B'], normalize='columns')

#聚合,指定列做為值,並將這些值按一定演演算法進行聚合:
pd.crosstab(df['A'], df['C'], values=df['D'], aggfunc=np.sum) #分類和數值

#邊距彙總,在最右邊增加一個彙總列:
pd.crosstab(df['A'], df['B'],values=df['D'],aggfunc=np.sum,
            normalize=True,margins=True)

資料融合melt()

#df.melt() 是 df.pivot() 逆轉操作函數。簡單說就是將指定的列放到鋪開放到行上名為variable(可指定)列,值在value(可指定)列 

語法結構:

具體語法結構如下:

pd.melt(frame: pandas.core.frame.DataFrame,id_vars=None, value_vars=None,
        var_name='variable', value_name='value',col_level=None)

其中:

  • id_varstuple:list或ndarray(可選),用作標識變數的列。
  • value_varstuple:列表或ndarray,可選,要取消透視的列。 如果未指定,則使用未設定為id_vars的所有列。
  • var_namescalar:用於“變數”列的名稱。 如果為None,則使用frame.columns.name或“variable”。
  • value_namescalar:預設為“ value”,用於“ value”列的名稱。
  • col_levelint或str:可選,如果列是MultiIndex,則使用此級別來融化。

生成案例資料:

df=pd.DataFrame({'A':['a1','a2','a3','a4','a5'],
                'B':['b1','b2','b3','b4','b5'],
                'C':[1,2,3,4,5]})
df

pd.melt(df)

#指定標識和值,
pd.melt(df,id_vars=['A'])  #只對BC展開

pd.melt(df,value_vars=['B','C']) #保留BC,並展開

#同時指定,並命名
pd.melt(df,id_vars=['A'],value_vars=['B'],var_name='B_label',value_name='B_value') 

資料堆疊 stack

#stack就是把列變數堆到行上,unstack就是行變到列上

生成案例資料 :

#堆疊 stack 單層索引:
df = pd.DataFrame({'A':['a1','a1','a2','a2'],
                  'B':['b1','b2','b1','b2'],
                  'C':[1,2,3,4],
                  'D':[5,6,7,8],
                  'E':[5,6,7,8]})
df.set_index(['A','B'],inplace=True)
df

 stack 堆疊

df.stack()

 unstack 解堆

df.stack().unstack()

df.stack().unstack().unstack()

df.stack().unstack().unstack().unstack()

 可以看到,解堆就是不停地把列變數弄到行上去作為索引。

到此這篇關於Pandas資料分析之pandas資料透視表和交叉表的文章就介紹到這了,更多相關pandas資料透視表內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com