Pandas-07-交叉表 透视表
1. 概念
- 交叉表:交叉表用于计算一列数据对于另外一列数据的分组个数(用于统计分组频率的特殊透视表)
- pd.crosstab(value1, value2)
- 透视表:透视表是将原有的DataFrame的列分别作为行索引和列索引,然后对指定的列应用聚集函数
- data.pivot_table()
- DataFrame.pivot_table([], index=[])
2. 交叉表案例分析
2.1 案例1:股票星期数据与涨跌幅的关系
-
数据准备
stock_day = pd.read_csv("./data/stock_day.csv") stock_day.drop(["ma5", "ma10", "ma20", "v_ma5", "v_ma10", "v_ma20"], axis=1, inplace=True) stock_day
提取出对应的星期数据和涨跌幅数据:
# 寻找星期几跟股票张得的关系 # 1、先把对应的日期找到星期几 stock_day["week"] = pd.to_datetime(stock_day.index).weekday # 2、假如把p_change按照大小去分个类0为界限 stock_day["p_n"] = np.where(stock_day["p_change"] > 0, 1, 0) stock_day.head()
通过交叉表找寻两列数据的关系:
stock_ct = pd.crosstab(index=stock_day["week"], columns=stock_day["p_n"])
-
求出涨跌幅的比例
对于每个星期一等的总天数求和,运用除法运算求出比例
stock_ct_p = stock_ct.div(stock_ct.sum(axis=1), axis=0)
-
画图查看效果
stock_ct_p.plot.bar(stacked=True)
3. 透视表案例分析
3.1 准备数据
data = pd.read_csv("./data/tips.csv")
data.head()

3.2 再次分析交叉表
# 1. 首先根据 time 列,将所有数据行分成 N 组(组数取决于 day 元素的种类个数)
# 2. 然后,分别计算每一组中,抽烟=Yes的个数、抽烟=No的个数
pd.crosstab(index=data["time"], columns=data["smoker"], margins=True)
smoker No Yes All
time
Dinner 106 70 176
Lunch 45 23 68
All 151 93 244
# 统计男性、女性抽烟、不抽烟的人数
pd.crosstab(index=data["sex"], columns=data["smoker"], margins=True)
smoker No Yes All
sex
Female 54 33 87
Male 97 60 157
All 151 93 244
3.3 透视表
DataFrame.pivot_table(values, index, columns, aggfun, margins=False):- values:要进行统计的列
- index:行索引
- columns:列索引
- aggfun:聚合函数
- margins=False:显示汇总
-
统计 不同性别中抽不抽烟 的 平均消费
data.pivot_table("total_bill", index="sex", columns=["smoker"]) smoker No Yes sex Female 18.105185 17.977879 Male 19.791237 22.284500 -
分别展示出 周四到周日 的 晚饭小费 和 午饭小费
data.pivot_table("tip", index=["day"], columns=["time"]) time Dinner Lunch day Fri 2.940000 2.382857 Sat 2.993103 NaN Sun 3.255132 NaN Thur 3.000000 2.767705 -
查看 周五 晚餐 不抽烟 的 小费
data.pivot_table("tip", index=["day", "time"], columns=["smoker"]) smoker No Yes day time Fri Dinner 2.750000 3.003333 Lunch 3.000000 2.280000 Sat Dinner 3.102889 2.875476 Sun Dinner 3.167895 3.516842 Thur Dinner 3.000000 NaN Lunch 2.666364 3.030000 -
查看 周五 不抽烟 晚餐 最多给了多少 小费
data.pivot_table("tip", index=["day"], columns=["smoker", "time"], aggfunc="max") smoker No Yes time Dinner Lunch Dinner Lunch day Fri 3.5 3.0 4.73 3.48 Sat 9.0 NaN 10.00 NaN Sun 6.0 NaN 6.50 NaN Thur 3.0 6.7 NaN 5.00

浙公网安备 33010602011771号