Pyhton科學計算工具Pandas(十)—— 透視表和交叉表
阿新 • • 發佈:2018-12-19
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
-----