【数据处理】Pandas库:交叉表

401 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情

注意:本案例使用 Jupyter Notebook 进行案例演示

1. 交叉表与透视表

1.1 使用crosstab(交叉表)实现

交叉表:交叉表用于计算一列数据对于另外一列数据的分组个数(寻找两个列之间的关系)

  • pd.crosstab(value1, value2)

    • value:你想要找到的哪个变量关系

导入相关库,并读取数据

import pandas as pd
import numpy as np
stock_jiaocha = pd.read_csv("stock_day.csv")
stock_jiaocha

运行结果如下图所示:

image.png

使用to_datetime函数将行索引转为datetime64类型

# pandas日期类型
date = pd.to_datetime(stock_jiaocha.index)
date

然后在表中新增一列星期数据,为stock_jiaocha["week"]赋予to_datetime后的星期数据即可,具体代码如下所示:

# 准备星期数据列,加载表中date.weekday自动读取对应的星期,将其赋值给stock_jiaocha["week"]列即可。
stock_jiaocha["week"] = date.weekday
stock_jiaocha.head()

运行结果如下图所示:可以看出在原表的最后一列新增了week列。 image.png

我们需要用到p_change列的数据进行逻辑运算,因此需要将其数据类型由字符串格式转为浮点数类型,使用如下语句进行转换。

x = np.array(stock_jiaocha["p_change"])
y = x.astype(np.float)
stock_jiaocha["p_change"] = y
stock_jiaocha

对于转换好的数据,我们对其进行逻辑运算,我们希望将p_change列大于零的数置为1,其余置为0。并且将判断后的数据保存在新建poma列中。 stock_jiaocha["p_change"] >0, 1, 0

  • 这种格式就表示stock_jiaocha["p_change"] >0为想要判断的条件
  • 后面的1, 0表示:若条件符合将该数据置为1,不符合则置为0.
# 准备涨跌幅数据列
# p_change大于0置为1,不满足条件置为0
stock_jiaocha["poma"] = np.where(stock_jiaocha["p_change"] >0, 1, 0)
stock_jiaocha

运行结果如下图所示:可以看出新增了一列poma数据,其中用1与0表示p_change的两种分类(大于0或者小于等于0)。 image.png

最终,我们使用交叉表函数将同一表中的两列数据进行交叉的操作,具体代码如下所示:

  • stock_jiaocha["week"]列与stock_jiaocha["poma"]列进行了交叉
# 交叉表
data_jiaocha = pd.crosstab(stock_jiaocha["week"], stock_jiaocha["poma"])
data_jiaocha
# 星期一:跌的:63,涨的:62
# 相当于分组

运行结果如下图所示:可以理解为,对于星期几对应的大于0的个数有多少,小于等于0的数据个数有多少。

image.png