【小白学机器学习35】数据表:整洁数据表,交叉表/列联表,以及两者转化pd.pivot_table()
目录
1 虽然这是个很基础的知识,但是我觉得有必要记录下
2 整洁数据表
3 交叉数据表的2种形式
3.0 交叉表的名字
3.1 2维的交叉表
3.2 用2维表现3维的
3.3 上述内容,具体的markdown文本
4 交叉数据表
4.1 交叉数据表并不整洁
4.2 但是交叉表也很有用:比如求 联合概率+边缘概率
4.3 总结
5 整洁数据表,可以直接pd.pivot_table()转化为交叉表
5.1 pd.pivot_table() 数据透视表公式
5.2 表虽然可以直接转,但是内容也需要合适
1 虽然这是个很基础的知识,但是我觉得有必要记录下
有些数据表很有问题,后导致后续的分析出问题,所以先检查和整理数据表是很有必要的一个步骤。
- #混乱数据
- 数据混乱
- 有些甚至把一个单元格填多个数据
- 有些虽然看着很清晰,但数据结构混乱
- #整洁数据
- 可读性比较强
2 整洁数据表
整洁数据表
这几个要求看起来很简单,但是有时候也容易忽视。
- 1.每1列代表1个属性
- 2.每1行代表1个样本(样本里包含多个数据)
- 3.每一个单元格,代表1个具体数据
- 4.每个类型的观察单元构成1个表格(不同类型的观察单元多个表格)
3 交叉数据表的2种形式
3.0 交叉表的名字
- 交叉表
- 交叉分类表
- 也叫列联表
3.1 2维的交叉表
- 常见的交叉表
- 列:属性1 如颜色
- 行:属性2 如 城市
- 单元格,具体数据
3.2 用2维表现3维的
- 实际上还是2维的
- 因为我们很难真的表现1个3维表格,虽然理论上可以通过 XYZ这样的三维图表示
- 其实,用2维表现3维的就是,列的属性,实际是2个维度,
- 列的维度1:上午,下午
- 列的更高维度,颜色
3.3 上述内容,具体的markdown文本
#混乱数据
数据混乱
有些甚至把一个单元格填多个数据
有些虽然看着很清晰,但数据结构混乱#整洁数据
可读性比较强##第1类表格:整洁数据表1.每1列代表1个属性
2.每1行代表1个样本(样本里包含多个数据)
3.每一个单元格,代表1个具体数据
4.每个类型的观察单元构成1个表格(不同类型的观察单元多个表格)序号|城市|颜色|销售量
----|----|----|----
1|北京|红色|98
2|北京|蓝色|90
3|上海|红色|86
4|上海|蓝色|95##第2类表格:数据交叉表二维城市\颜|红色|蓝色
----|----|----
北京|98|90
上海|86|95三维
交叉表|红色| 红色|蓝色| 蓝色
""|上午|下午|上午|下午
----|----|----|----|----
北京|48|50|40|50
上海|46|40|45|40
4 交叉数据表
4.1 交叉数据表并不整洁
- 从整洁数据的定义上说,交叉数据表“并不整洁”
- 原因:交叉数据表,往往是列表示一个属性,行也表示了一个属性
- 行,并不只是一个行样本(多个数据的数组!)
4.2 但是交叉表也很有用:比如求 联合概率+边缘概率
- 独立概率
- 联合概率:独立概率1*独立概率2
- 边缘概率:同1行 /同1列的所有联合概率相加的总和。
- 边缘概率分2种:行边缘概率,列边缘概率
- 为什么要全部相加?因为同1行/列 代表了所有的可能性,必须全加起来才=边缘概率
- (所有行的)Σ边缘概率和=1 = 总概率
- (所有列的)Σ边缘概率和=1= 总概率
- (概率空间的)总概率=1
4.3 总结
- 我的想法:
- 整洁数据表:更底层:适合作为原始数据,输入后,进行各种分析
- 各种上层的表现表形式:
- 交叉数据表,本身就是在整洁数据表的一种加工,是一种输出形式!
- 其他数据表表现形式
5 整洁数据表,可以直接pd.pivot_table()转化为交叉表
5.1 pd.pivot_table() 数据透视表公式
- pd.pivot_table(data=pd.Dataframe, values="单元格列名",aggfunc="sum新生成的求和列",index="横向的列名", columns="纵向的列名")
- pd.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')
参数说明:
- 数据源
- data:需要进行数据透视的DataFrame。pd.Dataframe
- 数据源重组
- values:用于聚合的列名,默认聚合所有数值列。"原表--单元格列名",
- index:数据透视表的index,从原数据的列中筛选。"原表--横向的列名",
- columns:数据透视表的columns,从原数据的列中筛选。"原表--纵向的列名"
- 重组关键函数
- aggfunc:用于聚合的函数,默认为’mean’,支持numpy的聚合函数。也可以是"sum"
- 其他效果
- fill_value:用于替换结果中的缺失值。
- margins:添加行/列小计和总计,默认为False。
- dropna:是否删除所有条目均为NA的列,默认为True。
- margins_name:总计列的名称,默认为’All’。
sample_dataframe11=pd.DataFrame({"city":sample_array11,
"color":sample_array22,
"sales":sample_array33,
})
#可以把np.Dataframe 直接转化为 交叉表/列联表
crosstable11=pd.pivot_table(data=sample_dataframe11,values="sales",
aggfunc="sum",
index="city",
columns="color")
5.2 表虽然可以直接转,但是内容也需要合适
- 把 “整洁数据表”转化为交叉表,虽然可以直接用pd.pivot_table(),但是表本身的内容也需要符合,适合转化为交叉表"
- 例子1数据表本身不适合转化为交叉表,可以转,转完后格式比较奇怪,没啥意义"
- 例子2:数据表本身很适合转化为交叉表,可以转,转完后很好"
import numpy as np
import pandas as pd
import scipy as sp
%precision 3print("#把 “整洁数据表”转化为交叉表,虽然可以直接用pd.pivot_table(),但是表本身的内容也需要符合,适合转化为交叉表")
print("#例子1数据表本身不适合转化为交叉表,可以转,转完后格式比较奇怪,没啥意义")sample_array1=np.array([1,2,3])
sample_array2=np.array([10,20,30])
sample_array3=np.array([100,200,300])# 注意pd.DataFrame 首字母一定大写
sample_dataframe1=pd.DataFrame({"city":sample_array1,"color":sample_array2,"sales":sample_array3,})
print(sample_dataframe1)
print()#可以把np.Dataframe 直接转化为 交叉表/列联表
crosstable1=pd.pivot_table(data=sample_dataframe1,values="sales",aggfunc="sum",index="city",columns="color")
print(crosstable1)
print()print("#例子2:数据表本身很适合转化为交叉表,可以转,转完后很好")
sample_array11=np.array(["beijing","beijing","shanghai","shanghai"])
sample_array22=np.array(["blue","red","blue","red"])
sample_array33=np.array([100,150,200,120])# 注意pd.DataFrame 首字母一定大写
sample_dataframe11=pd.DataFrame({"city":sample_array11,"color":sample_array22,"sales":sample_array33,})
print(sample_dataframe11)
print()#可以把np.Dataframe 直接转化为 交叉表/列联表
crosstable11=pd.pivot_table(data=sample_dataframe11,values="sales",aggfunc="sum",index="city",columns="color")
print(crosstable11)
print()