Python數據分析實戰【第三章】2.21-透視表及交叉表【python】

【課程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
-----
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章