【小白学机器学习35】数据表:整洁数据表,交叉表/列联表,以及两者转化pd.pivot_table()

目录

[1 虽然这是个很基础的知识,但是我觉得有必要记录下](#1 虽然这是个很基础的知识,但是我觉得有必要记录下)

[2 整洁数据表](#2 整洁数据表)

[3 交叉数据表的2种形式](#3 交叉数据表的2种形式)

[3.0 交叉表的名字](#3.0 交叉表的名字)

[3.1 2维的交叉表](#3.1 2维的交叉表)

[3.2 用2维表现3维的](#3.2 用2维表现3维的)

[3.3 上述内容,具体的markdown文本](#3.3 上述内容,具体的markdown文本)

[4 交叉数据表](#4 交叉数据表)

[4.1 交叉数据表并不整洁](#4.1 交叉数据表并不整洁)

[4.2 但是交叉表也很有用:比如求 联合概率+边缘概率](#4.2 但是交叉表也很有用:比如求 联合概率+边缘概率)

[4.3 总结](#4.3 总结)

[5 整洁数据表,可以直接pd.pivot_table()转化为交叉表](#5 整洁数据表,可以直接pd.pivot_table()转化为交叉表)

[5.1 pd.pivot_table() 数据透视表公式](#5.1 pd.pivot_table() 数据透视表公式)

[5.2 表虽然可以直接转,但是内容也需要合适](#5.2 表虽然可以直接转,但是内容也需要合适)


1 虽然这是个很基础的知识,但是我觉得有必要记录下

有些数据表很有问题,后导致后续的分析出问题,所以先检查和整理数据表是很有必要的一个步骤。

  • #混乱数据
  1. 数据混乱
  2. 有些甚至把一个单元格填多个数据
  3. 有些虽然看着很清晰,但数据结构混乱
  • #整洁数据
  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. 列的维度1:上午,下午
  2. 列的更高维度,颜色

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列的所有联合概率相加的总和。
  1. 边缘概率分2种:行边缘概率,列边缘概率
  2. 为什么要全部相加?因为同1行/列 代表了所有的可能性,必须全加起来才=边缘概率
  3. (所有行的)Σ边缘概率和=1 = 总概率
  4. (所有列的)Σ边缘概率和=1= 总概率
  • (概率空间的)总概率=1

4.3 总结

  • 我的想法:
  • 整洁数据表:更底层:适合作为原始数据,输入后,进行各种分析
  • 各种上层的表现表形式:
  1. 交叉数据表,本身就是在整洁数据表的一种加工,是一种输出形式!
  2. 其他数据表表现形式

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 3

    print("#把 "整洁数据表"转化为交叉表,虽然可以直接用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()

相关推荐
AI技术控19 分钟前
计算机视觉算法实战——驾驶员安全带检测
人工智能·算法·计算机视觉
LucianaiB20 分钟前
基于自然语言处理的垃圾短信识别系统
人工智能·自然语言处理·垃圾短信识别系统
feifeikon1 小时前
大模型GUI系列论文阅读 DAY4续:《Large Language Model Agent for Fake News Detection》
论文阅读·人工智能·语言模型
feifeikon1 小时前
图神经网络系列论文阅读DAY1:《Predicting Tweet Engagement with Graph Neural Networks》
论文阅读·人工智能·神经网络
ZStack开发者社区3 小时前
AI应用、轻量云、虚拟化|云轴科技ZStack参编金融行标与报告
人工智能·科技·金融
存内计算开发者4 小时前
机器人奇点:从宇树科技看2025具身智能发展
深度学习·神经网络·机器学习·计算机视觉·机器人·视觉检测·具身智能
真想骂*5 小时前
人工智能如何重塑音频、视觉及多模态领域的应用格局
人工智能·音视频
赛丽曼7 小时前
机器学习-K近邻算法
人工智能·机器学习·近邻算法
啊波次得饿佛哥9 小时前
7. 计算机视觉
人工智能·计算机视觉·视觉检测
XianxinMao9 小时前
RLHF技术应用探析:从安全任务到高阶能力提升
人工智能·python·算法