【Pandas】交叉表与透视表


学习目标

  • 应用crosstabpivot_table实现交叉表与透视表

1 交叉表与透视表作用

探究股票的涨跌与星期几有关?

以下图当中表示,week代表星期几,1,0代表这一天股票的涨跌幅是好还是坏,里面的数据代表比例

可以理解为所有时间为星期一等等的数据当中涨跌幅好坏的比例


2 crosstab(交叉表) & pivot_table(透视表)

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

  • pd.crosstab(value1, value2)
  • DataFrame.pivot_table([], index=[])

3 案例

# 读取股票的数据
data = pd.read_csv("../Pandas/data/stock_day.csv")

data.head()

在这里插入图片描述


3.1 数据准备

  • 准备两列数据,星期数据以及涨跌幅是好是坏数据
  • 进行交叉表计算
# 寻找星期几跟股票涨跌的关系

## 日期索引
date = pd.to_datetime(data.index)

Index(['2018-02-27', '2018-02-26', '2018-02-23', '2018-02-22', '2018-02-14',
       '2018-02-13', '2018-02-12', '2018-02-09', '2018-02-08', '2018-02-07',
       ...
       '2015-03-13', '2015-03-12', '2015-03-11', '2015-03-10', '2015-03-09',
       '2015-03-06', '2015-03-05', '2015-03-04', '2015-03-03', '2015-03-02'],
      dtype='object', length=643)

## 日索引
date.day
Int64Index([27, 26, 23, 22, 14, 13, 12,  9,  8,  7,
            ...
            13, 12, 11, 10,  9,  6,  5,  4,  3,  2],
           dtype='int64', length=643)

## 周索引
date.week
Int64Index([ 9,  9,  8,  8,  7,  7,  7,  6,  6,  6,
            ...
            11, 11, 11, 11, 11, 10, 10, 10, 10, 10],
           dtype='int64', length=643)

## 周x索引
data.weekday
Int64Index([1, 0, 4, 3, 2, 1, 0, 4, 3, 2,
            ...
            4, 3, 2, 1, 0, 4, 3, 2, 1, 0],
           dtype='int64', length=643)

  • 1、先把对应的日期找到星期几
date = pd.to_datetime(data.index)

data["weekday"] = date.weekday

data.head()

在这里插入图片描述

  • 2、把p_change按照正负分为0或1
# 'p_change' 大于0分为1 小于0分为0
data['posi_neg'] = np.where(data['p_change'] > 0, 1, 0)

在这里插入图片描述

  • 3、通过交叉表crosstab找寻两列数据的关系
count = pd.crosstab(data['weekday'], data['posi_neg'])
count


posi_neg	0			1
weekday		
0			63			62		# 可见周一'p_change'为负的有63个,为正的有62个
1			55			76
2			61			71
3			63			65
4			59			68

# 但是我们看到 count 只是每个星期日子的好坏天数,为了更直观的显示需得出其比例
  • 4、对于每个星期一等的总天数求和,运用除法运算求出比例
sum = count.sum(axis=1)
sum

weekday
0    125
1    131
2    132
3    128
4    127
dtype: int64

per = count.div(sum, axis=0)
per

posi_neg	0				1
weekday		
0			0.504000		0.496000
1			0.419847		0.580153
2			0.462121		0.537879
3			0.492188		0.507812
4			0.464567		0.535433

3.2 查看效果

使用plot画出这个比例,使用stacked的柱状图

per.plot(kind="bar", stacked=True)
plt.show()

在这里插入图片描述


3.3 pivot_table(透视表)实现

使用透视表,刚才的过程更加简单

# 通过透视表,将整个过程变成更简单一些
data.pivot_table(['posi_neg'], index='week')

	posi_neg
weekday	
0	0.496000		# 小于0.5表示为跌
1	0.580153
2	0.537879
3	0.507812
4	0.535433

4 小结

  • 什么交叉表,透视表
    • 就是探索两列数据之间的关系
  • pd.crosstab()
    • 返回具体数量
  • 对象.pivot_table()
    • 返回占比情况

相关链接


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pandas 中的交叉透视都是用于数据分析和汇总的工具,但它们在处理数据时有所不同。 交叉可以帮助我们快速计算两个或多个因素之间的频数,而透视则可以帮助我们将数据按照不同的维度进行分组并进行聚合计算。 下面我将分别介绍一下 pandas 中的交叉透视。 ## 交叉 pandas 中的 `crosstab()` 函数可以帮助我们创建交叉。该函数的语法如下: ```python pandas.crosstab(index, columns, values=None, aggfunc=None, margins=False, margins_name='All', dropna=True, normalize=False) ``` 其中: - `index`:用于指定行索引的列或列名。 - `columns`:用于指定列索引的列或列名。 - `values`:用于指定填充交叉数据列或列名。如果不指定,则默认为计数。 - `aggfunc`:用于指定对数据进行聚合计算的函数。默认为计数。 - `margins`:用于指定是否在交叉中添加行/列合计。默认为 False。 - `margins_name`:用于指定行/列合计的名称。默认为 "All"。 - `dropna`:用于指定是否删除包含缺失值的行/列。默认为 True。 - `normalize`:用于指定是否对交叉进行标准化。 下面是一个示例: ```python import pandas as pd data = { "Gender": ["F", "M", "F", "M", "M", "M", "F", "F", "M", "F"], "Age": [30, 25, 35, 40, 30, 45, 35, 25, 30, 35], "City": ["Beijing", "Shanghai", "Guangzhou", "Shenzhen", "Shanghai", "Beijing", "Shenzhen", "Guangzhou", "Beijing", "Shenzhen"] } df = pd.DataFrame(data) print(df) # 创建交叉 ct = pd.crosstab(df["Gender"], df["City"]) print(ct) ``` 输出结果为: ``` Gender Age City 0 F 30 Beijing 1 M 25 Shanghai 2 F 35 Guangzhou 3 M 40 Shenzhen 4 M 30 Shanghai 5 M 45 Beijing 6 F 35 Shenzhen 7 F 25 Guangzhou 8 M 30 Beijing 9 F 35 Shenzhen City Beijing Guangzhou Shanghai Shenzhen Gender F 1 1 0 2 M 2 0 2 1 ``` 上面的代码首先创建了一个包含 Gender、Age 和 City 三列数据的 DataFrame。然后使用 `crosstab()` 函数创建了一个交叉,用于统计不同性别和城市的人数。 从输出结果可以看出,交叉中的行和列分别对应于原始数据中的 Gender 和 City 列。交叉中的值示对应行和列的交叉处的人数。 ## 透视 pandas 中的 `pivot_table()` 函数可以帮助我们创建透视。该函数的语法如下: ```python pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, margins_name='All', dropna=True) ``` 其中: - `data`:用于指定要使用的数据集。 - `values`:用于指定要进行聚合计算的数据列或列名。 - `index`:用于指定行索引的列或列名。 - `columns`:用于指定列索引的列或列名。 - `aggfunc`:用于指定对数据进行聚合计算的函数。默认为平均值。 - `fill_value`:用于指定要用于填充缺失值的值。 - `margins`:用于指定是否在透视中添加行/列合计。默认为 False。 - `margins_name`:用于指定行/列合计的名称。默认为 "All"。 - `dropna`:用于指定是否删除包含缺失值的行/列。默认为 True。 下面是一个示例: ```python import pandas as pd data = { "Gender": ["F", "M", "F", "M", "M", "M", "F", "F", "M", "F"], "Age": [30, 25, 35, 40, 30, 45, 35, 25, 30, 35], "City": ["Beijing", "Shanghai", "Guangzhou", "Shenzhen", "Shanghai", "Beijing", "Shenzhen", "Guangzhou", "Beijing", "Shenzhen"] } df = pd.DataFrame(data) print(df) # 创建透视 pt = pd.pivot_table(df, values="Age", index="City", columns="Gender", aggfunc="mean") print(pt) ``` 输出结果为: ``` Gender Age City 0 F 30 Beijing 1 M 25 Shanghai 2 F 35 Guangzhou 3 M 40 Shenzhen 4 M 30 Shanghai 5 M 45 Beijing 6 F 35 Shenzhen 7 F 25 Guangzhou 8 M 30 Beijing 9 F 35 Shenzhen Gender F M City Beijing 32.500000 37.500000 Guangzhou 30.000000 NaN Shanghai NaN 27.500000 Shenzhen 35.000000 40.000000 ``` 上面的代码首先创建了一个包含 Gender、Age 和 City 三列数据的 DataFrame。然后使用 `pivot_table()` 函数创建了一个透视,用于统计不同城市和性别的平均年龄。 从输出结果可以看出,透视中的行和列分别对应于原始数据中的 City 和 Gender 列。透视中的值示对应行和列的交叉处的平均年龄。如果原始数据中没有某一行/列的数据,则透视中对应的单元格会显示为 NaN。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值