一行代碼制作數據分析交叉表,太便捷了
在前文中我們了解到Pandas模塊中的pivot_table()函數可以用來制作數據透視表。
模塊導入和數據讀取
那我們按照慣例,首先導入模塊并且來讀取所要使用到的數據集,引用的依然是之前制作數據透視表的數據集
import pandas as pd
def load_data():
return pd.read_csv('coffee_sales.csv', parse_dates=['order_date'])
那這里小編是通過自定義一個函數,然后通過調用該函數來讀取數據,在實際工作當中每個人都可以根據自己的喜好來操作:
df = load_data()
df.head()
output
牛刀小試
交叉表是用于統計分組頻率的特殊透視表。簡單來說,就是將兩個或者多個列中不重復的元素組成一個新的DataFrame,新數據的行和列交叉的部分值為其組合在原數據中的數量,我們先來看一個簡單的例子,代碼如下:
pd.crosstab(index = df['region'], columns = df['product_category'])
output
在行方向上代表的是不同的地區,而在列方向上代表的則是不同的咖啡種類,出來的結果表示的是不同地區不同咖啡種類的匯總數據,
df[(df["region"] == "Central")&(df["product_category"] == "Tea")].shape[0]
output
336
例如我們篩選出地區是中部地區并且品種是茶飲的數據,出來的結果總共有336條數據,和交叉表中的結果一致。
我們可以對列名以及行索引更換名字,通過調用rownames參數以及colnames參數,代碼如下:
pd.crosstab(
index = df['region'],
columns = df['product_category'],
rownames=['US Region'],
colnames=['Product Category']
)
output
除了咖啡的品類之外,我們還想要知道到底不同品種的咖啡在批發和零售之間銷量的數據,就可以這么來操作:
pd.crosstab(
index = df['region'],
columns = [df['product_category'], df['market']]
)
output
或者是
pd.crosstab(
index = df['region'],
columns = [df['product_category'], df['market']],
rownames=['US Region'],
colnames=['Product Category', 'Market']
)
output
輸出的DataFrame數據集當中的列有兩層,最上面的是咖啡的種類,然后緊接著第二層的便是不同的市場,當然我們也可以在行方向上添加多個層次的索引,代碼如下:
pd.crosstab(
index = [df['region'], df['market']],
columns = df['product_category']
)
output
進階的操作
和pd.pivot_table()函數一樣,我們也可以通過調用當中的margin參數來給整合出來的數據做一個加總,代碼如下:
pd.crosstab(index = df['region'],
columns = df['product_category'],
margins = True)
output
我們還能指定該列的列名。
pd.crosstab(
index = df['region'],
columns = df['product_category'],
margins = True,
margins_name = 'Subtotals'
)
output
另外還有參數normalize用來將所有值除以值的總和進行歸一化。
pd.crosstab(index = df['region'],
columns = df['product_category'],
normalize = True)
output
我們從美觀的角度出發,想要保留兩位小數,代碼如下:
pd.crosstab(
index = df['region'],
columns = df['product_category'],
normalize = True
).style.format('{:.2%}')
output
要是和之間的margin參數相結合來使用的話,將所有的結果匯總到一起等于100%,代碼如下:
pd.crosstab(
index = df['region'],
columns = df['product_category'],
margins = True,
normalize = True
).style.format('{:.2%}')
output
進一步衍生
最后還有values以及aggfunc兩參數,其中aggfunc參數具體指的是指定聚合函數,例如平均數、求和以及中位數等統計方法,對value參數指定的連續性變量的列進行計算。
df.info()
output
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4248 entries, 0 to 4247
Data columns (total 9 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 order_date 4248 non-null datetime64[ns]
1 market 4248 non-null object
2 region 4248 non-null object
3 product_category 4248 non-null object
4 product 4248 non-null object
5 cost 4248 non-null int64
6 inventory 4248 non-null int64
7 net_profit 4248 non-null int64
8 sales 4248 non-null int64
dtypes: datetime64[ns](1), int64(4), object(4)
memory usage: 298.8+ KB
當前數據集中“market”、“region”、“product_category”、“product”四列是離散型變量,而有“cost”、“inventory”、“net_profit”、“sales”四列是連續性變量,分別代表的是成本、庫存、凈利潤以及銷量,其中我們想針對不同地區、不同咖啡種類的成本做一個平均值,那么代碼如下:
pd.crosstab(
index = df['region'],
columns = df['product_category'],
values = df['cost'],
aggfunc = 'mean'
)
output
要是我們想要對計算出來的結果保留兩位小數,代碼如下:
pd.crosstab(
index = df['region'],
columns = df['product_category'],
values = df['cost'],
aggfunc = 'mean'
).round(2)
output
當然要是針對存在缺失值的情況,我們也可以替換成其他值來處理,代碼如下:
pd.crosstab(
index = df['region'],
columns = df['product_category'],
values = df['cost'],
aggfunc = 'mean',
).fillna(0)
output