Loading

Pandas-07-交叉表 透视表

1. 概念

  • 交叉表:交叉表用于计算一列数据对于另外一列数据的分组个数(用于统计分组频率的特殊透视表)
    • pd.crosstab(value1, value2)
  • 透视表:透视表是将原有的DataFrame的列分别作为行索引和列索引,然后对指定的列应用聚集函数
    • data.pivot_table()
    • DataFrame.pivot_table([], index=[])

2. 交叉表案例分析

2.1 案例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
    

    image-20210420102729603

    提取出对应的星期数据和涨跌幅数据:

    # 寻找星期几跟股票张得的关系
    # 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()
    

    image-20210420102958478

    通过交叉表找寻两列数据的关系:

    stock_ct = pd.crosstab(index=stock_day["week"], columns=stock_day["p_n"])
    

    image-20210420103124604

  2. 求出涨跌幅的比例

    对于每个星期一等的总天数求和,运用除法运算求出比例

    stock_ct_p = stock_ct.div(stock_ct.sum(axis=1), axis=0)
    

    image-20210420103458339

  3. 画图查看效果

    stock_ct_p.plot.bar(stacked=True)
    

    image-20210420103638189

3. 透视表案例分析

3.1 准备数据

data = pd.read_csv("./data/tips.csv")
data.head()

image-20210420102241050

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:显示汇总
  1. 统计 不同性别中抽不抽烟 的 平均消费

    data.pivot_table("total_bill", index="sex", columns=["smoker"])
    
    smoker	       No	      Yes
    sex		
    Female	18.105185	17.977879
      Male	19.791237	22.284500
    
  2. 分别展示出 周四到周日 的 晚饭小费 和 午饭小费

    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
    
  3. 查看 周五 晚餐 不抽烟 的 小费

    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
    
  4. 查看 周五 不抽烟 晚餐 最多给了多少 小费

    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
    
posted @ 2021-05-02 15:02  七年i  阅读(220)  评论(0)    收藏  举报