【課程2.21】 透視表及交叉表
類似excel數據透視 - pivot table / crosstab
1.透視表: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(pd.pivot_table(df, values = 'values', index = 'date', columns = 'key', aggfunc=np.sum)) # 也可以寫 aggfunc='sum'
# data:DataFrame對象
# values:要聚合的列或列的列表
# index:數據透視表的index,從原數據的列中篩選
# columns:數據透視表的columns,從原數據的列中篩選
# aggfunc:用於聚合的函數,默認爲numpy.mean,支持numpy計算方法
print(pd.pivot_table(df, values = 'values', index = ['date','key'], aggfunc=len))
# 這裏就分別以date、key共同做數據透視,值爲values:統計不同(date,key)情況下values的平均值
# aggfunc=len(或者count):計數
----------------------------------------------------------------------
date key values
0 2017-05-01 a 5.886424
1 2017-05-02 b 9.906472
2 2017-05-03 c 8.617297
3 2017-05-01 d 8.972318
4 2017-05-02 a 7.990905
5 2017-05-03 b 8.131856
6 2017-05-01 c 2.823731
7 2017-05-02 d 2.394605
8 2017-05-03 a 0.667917
-----
key a b c d
date
2017-05-01 5.886424 NaN 2.823731 8.972318
2017-05-02 7.990905 9.906472 NaN 2.394605
2017-05-03 0.667917 8.131856 8.617297 NaN
-----
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
Name: values, dtype: float64
-----
2.交叉表: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(pd.crosstab(df['A'],df['B']))
# 如果crosstab只接收兩個Series,它將提供一個頻率表。
# 用A的唯一值,統計B唯一值的出現次數
print(pd.crosstab(df['A'],df['B'],normalize=True))
# normalize:默認False,將所有值除以值的總和進行歸一化 → 爲True時候顯示百分比
print(pd.crosstab(df['A'],df['B'],values=df['C'],aggfunc=np.sum))
# values:可選,根據因子聚合的值數組
# aggfunc:可選,如果未傳遞values數組,則計算頻率表,如果傳遞數組,則按照指定計算
# 這裏相當於以A和B界定分組,計算出每組中第三個系列C的值
print(pd.crosstab(df['A'],df['B'],values=df['C'],aggfunc=np.sum, margins=True))
# 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
-----