1. 程式人生 > >Pyhton科學計算工具Pandas(十)—— 透視表和交叉表

Pyhton科學計算工具Pandas(十)—— 透視表和交叉表

Pyhton科學計算工具Pandas(十)—— 透視表和交叉表.ipynb

透視表

# 透視表:pivot_table
# pd.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')

date = ['2017-5-1','2017-5-2','2017-5-3']*3
rng = pd.to_datetime(date)
df = pd.DataFrame({'date'
:rng, 'key':list('abcdabcda'), 'values':np.random.rand(9)*10}) print(df) print('-----') print(pd.pivot_table(df, values = 'values', index = 'date', columns = 'key', aggfunc=np.sum)) # 也可以寫 aggfunc='sum' print('-----') # data:DataFrame物件 # values:要聚合的列或列的列表 # index:資料透視表的index,從原資料的列中篩選
# columns:資料透視表的columns,從原資料的列中篩選 # aggfunc:用於聚合的函式,預設為numpy.mean,支援numpy計算方法 print(pd.pivot_table(df, values = 'values', index = ['date','key'], aggfunc=len)) print('-----') # 這裡就分別以date、key共同做資料透視,值為values:統計不同(date,key)情況下values的平均值 # aggfunc=len(或者count):計數
        date key    values
0 2017-05-01   a  4.395979
1 2017-05-02   b  8.212326
2 2017-05-03   c  9.759327
3 2017-05-01   d  9.336916
4 2017-05-02   a  0.170616
5 2017-05-03   b  6.034662
6 2017-05-01   c  2.305592
7 2017-05-02   d  0.707555
8 2017-05-03   a  7.578554
-----
key                a         b         c         d
date                                              
2017-05-01  4.395979       NaN  2.305592  9.336916
2017-05-02  0.170616  8.212326       NaN  0.707555
2017-05-03  7.578554  6.034662  9.759327       NaN
-----
                values
date       key        
2017-05-01 a       1.0
           c       1.0
           d       1.0
2017-05-02 a       1.0
           b       1.0
           d       1.0
2017-05-03 a       1.0
           b       1.0
           c       1.0
-----

交叉表

# 交叉表:crosstab
# 預設情況下,crosstab計算因子的頻率表,比如用於str的資料透視分析
# pd.crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins=False, dropna=True, normalize=False)

df = pd.DataFrame({'A': [1, 2, 2, 2, 2],
                   'B': [3, 3, 4, 4, 4],
                   'C': [1, 1, np.nan, 1, 1]})
print(df)
print('-----')

print(pd.crosstab(df['A'],df['B']))
print('-----頻率表')
# 如果crosstab只接收兩個Series,它將提供一個頻率表。
# 用A的唯一值,統計B唯一值的出現次數

print(pd.crosstab(df['A'],df['B'],normalize=True))
print('-----歸一化')
# normalize:預設False,將所有值除以值的總和進行歸一化 → 為True時候顯示百分比

print(pd.crosstab(df['A'],df['B'],values=df['C'],aggfunc=np.sum))
print('-----求和')
# values:可選,根據因子聚合的值陣列
# aggfunc:可選,如果未傳遞values陣列,則計算頻率表,如果傳遞陣列,則按照指定計算
# 這裡相當於以A和B界定分組,計算出每組中第三個系列C的值

print(pd.crosstab(df['A'],df['B'],values=df['C'],aggfunc=np.sum, margins=True))
print('-----')
# margins:布林值,預設值False,新增行/列邊距(小計)
   A  B    C
0  1  3  1.0
1  2  3  1.0
2  2  4  NaN
3  2  4  1.0
4  2  4  1.0
-----
B  3  4
A      
1  1  0
2  1  3
-----頻率表
B    3    4
A          
1  0.2  0.0
2  0.2  0.6
-----歸一化
B    3    4
A          
1  1.0  NaN
2  1.0  2.0
-----求和
B      3    4  All
A                 
1    1.0  NaN  1.0
2    1.0  2.0  3.0
All  2.0  2.0  4.0
-----