数据分析时,同事经常给你一份二维表,是不是分分钟有想哭的冲动,一大堆的东西在一块,怎么透视?想要做进一步分析,也是特别麻烦。今天给你一种方便的方法。

一、入门版

先来看看可能要处理的文件是什么样的?

看看,别提多闹心了。当然我们不可能一开始就处理这么复杂的样式。先来个简单的验证一下。

如上这样一个二维数据,怎么变成一维数据呢?

excel中可以这样操作

选择数据透视表,快捷键alt+d+p,这里是用wps的演示的,用office是一样的效果

选择多重合并计算区域

创建单面字段

选择数据区域

添加数据区域

点击完成,默认新工作表确定

这样一个数据透视表就出现了

到这时,读者可能想,还是没有变成一维表呀,这不依然是二维表。别急,还有下面的关键步骤。

在透视表的区域里去除行和列的数据,只保留值的区域

改变前

改变后

这是我们的数据透视表变成了这样:

双击数值,我们这里就是这个6762

这时就进入了这样一个界面,相信细心的朋友一定能发现这里正好就是我们要的二维数据了,复制整个内容,更改一下列名。

让我们头痛的二维表就这样变成了一维表。

二、进阶版

完成了这样一个简单的验证,我们再来考虑一下我们开头提到的复杂样式?这个该怎么处理呢?是不是也可以用这种方法解决呢?

先试一试

好像没那么管用了,我们希望的是二级区域,业务员,类型这些也能像一级大区这样展开,可是这里却混在了一起。这可怎么办呢?

Pandas来救场

熟悉python的应该知道,python经常被说成是数据分析的好工具,但是其实python能进入数据分析领域,pandas才是其中最大的功臣,pandas和numpy成为python数据分析最大的法宝。这里我们就要用到pandas的一个很方便的功能。

引入相关包

# 引入相关包

import pandas as pd

import numpy as np

读入文件

# 读入文件

file = r"E:\销售数据报表项目\医美专题\2dims.xlsx"

df = pd.read_excel(file)

df.head()

数据输出:

一级大区 二级区域 业务员 型号 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月

0 南区 浙南区域 name1 type1 222.392385 110.46942 207.566226 208.341450 234.989775 244.680075 239.834925 249.525225 205.918875 276.17355 296.52318 290.709

1 南区 浙南区域 name1 type2 52.166115 25.91258 48.688374 48.870217 55.121058 57.394092 56.257575 58.530608 48.301958 64.78145 69.55482 68.191

2 南区 浙南区域 name2 type1 866.394630 430.36596 808.634988 811.655100 915.471450 953.222850 934.347150 972.098550 802.217250 1075.91490 1155.19284 1132.542

3 南区 浙南区域 name2 type2 203.228370 100.95004 189.679812 190.388233 214.740217 223.595483 219.167850 228.023117 188.174417 252.37510 270.97116 265.658

4 南区 浙南区域 name3 type1 1280.382795 636.00714 1195.023942 1199.487150 1352.909925 1408.700025 1380.804975 1436.595075 1185.539625 1590.01785 1707.17706 1673.703

可以看到,和我们在excel里看到的内容是一致的。

下面我们就要开始变换处理了。

变换处理

# 变换处理

df1 = df.set_index(['一级大区','二级区域','业务员','型号'])

df2 = df1.stack()

df3 = df2.reset_index()

df3.columns = ['primary_area', 'sub_area', 'sales_man',

'product_specifications', 'month', 'target']

df3

数据输出:

primary_area sub_area sales_man product_specifications month target

0 南区 浙南区域 name1 type1 1月 222.392385

1 南区 浙南区域 name1 type1 2月 110.469420

2 南区 浙南区域 name1 type1 3月 207.566226

3 南区 浙南区域 name1 type1 4月 208.341450

4 南区 浙南区域 name1 type1 5月 234.989775

5 南区 浙南区域 name1 type1 6月 244.680075

6 南区 浙南区域 name1 type1 7月 239.834925

7 南区 浙南区域 name1 type1 8月 249.525225

8 南区 浙南区域 name1 type1 9月 205.918875

9 南区 浙南区域 name1 type1 10月 276.173550

10 南区 浙南区域 name1 type1 11月 296.523180

11 南区 浙南区域 name1 type1 12月 290.709000

12 南区 浙南区域 name1 type2 1月 52.166115

...

3405 北区 山东大区 name140 type2 10月 127.680000

3406 北区 山东大区 name140 type2 11月 137.088000

3407 北区 山东大区 name140 type2 12月 134.400000

3408 rows × 6 columns

可以看到,二维表已经变成了我们想要的一维表了。

这中间到底发生了什么魔法?

我们来解释下刚刚的代码:

# 变换处理开始

# 首先把数据df设置成多项索引,就像下面这样

df1 = df.set_index(['一级大区','二级区域','业务员','型号'])

# 然后把二维表格变成堆叠样式

df2 = df1.stack()

# 再把堆叠样式的数据重建索引

df3 = df2.reset_index()

# 我们把原来一行的内容转变成一列了,系统当然不知道应该叫什么,

# 所以我们这里要给新出现的列命名,这里为了方便后面分析使用,

# 直接给所有列重命名成英文

df3.columns = ['primary_area', 'sub_area', 'sales_man',

'product_specifications', 'month', 'target']

# 那么为什么要生成df1,2,3呢? 这是为了覆盖原数据,防止我们误操作了没法复原

再来看看,每次变更后的数据是怎么样的:

# 设置多项索引后

In: df1

Out:

1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月

一级大区 二级区域 业务员 型号

南区 浙南区域 name1 type1 222.392385 110.469420 207.566226 208.341450 234.989775 244.680075 239.834925 249.525225 205.918875 276.17355 296.52318 290.709

type2 52.166115 25.912580 48.688374 48.870217 55.121058 57.394092 56.257575 58.530608 48.301958 64.78145 69.55482 68.191

name2 type1 866.394630 430.365960 808.634988 811.655100 915.471450 953.222850 934.347150 972.098550 802.217250 1075.91490 1155.19284 1132.542

type2 203.228370 100.950040 189.679812 190.388233 214.740217 223.595483 219.167850 228.023117 188.174417 252.37510 270.97116 265.658

name3 type1 1280.382795 636.007140 1195.023942 1199.487150 1352.909925 1408.700025 1380.804975 1436.595075 1185.539625 1590.01785 1707.17706 1673.703

type2 300.336705 149.186860 280.314258 281.361183 317.349242 330.435808 323.892525 336.979092 278.089542 372.96715 400.44894 392.597

name4 type1 891.738315 442.954980 832.289094 835.397550 942.250725 981.106425 961.678575 1000.534275 825.683625 1107.38745 1188.98442 1165.671

type2 209.173185 103.903020 195.228306 195.957450 221.021775 230.136075 225.578925 234.693225 193.678875 259.75755 278.89758 273.429

浙北区域 name5 type1 644.436000 320.112000 601.473600 603.720000 680.940000 709.020000 694.980000 723.060000 596.700000 800.28000 859.24800 842.400

type2 151.164000 75.088000 141.086400 141.613333 159.726667 166.313333 163.020000 169.606667 139.966667 187.72000 201.55200 197.600

name6 type1 619.650000 307.800000 578.340000 580.500000 654.750000 681.750000 668.250000 695.250000 573.750000 769.50000 826.20000 810.000

# 改成堆叠样式后

In:df2

Out:

一级大区 二级区域 业务员 型号

南区 浙南区域 name1 type1 1月 222.392385

2月 110.469420

3月 207.566226

4月 208.341450

5月 234.989775

6月 244.680075

7月 239.834925

8月 249.525225

9月 205.918875

10月 276.173550

11月 296.523180

12月 290.709000

type2 1月 52.166115

2月 25.912580

3月 48.688374

4月 48.870217

5月 55.121058

6月 57.394092

7月 56.257575

8月 58.530608

9月 48.301958

10月 64.781450

11月 69.554820

12月 68.191000

name2 type1 1月 866.394630

2月 430.365960

有点像是大括号括起来的效果。不过这里可以看到月份和销售额是没有列名的。

# 这里为了演示,又重新建了一个df,

# 因为前面df3已经重命名列名了

In: df4 = df2.reset_index()

df4

Out:

一级大区 二级区域 业务员 型号 level_4 0

0 南区 浙南区域 name1 type1 1月 222.392385

1 南区 浙南区域 name1 type1 2月 110.469420

2 南区 浙南区域 name1 type1 3月 207.566226

3 南区 浙南区域 name1 type1 4月 208.341450

4 南区 浙南区域 name1 type1 5月 234.989775

5 南区 浙南区域 name1 type1 6月 244.680075

6 南区 浙南区域 name1 type1 7月 239.834925

7 南区 浙南区域 name1 type1 8月 249.525225

8 南区 浙南区域 name1 type1 9月 205.918875

9 南区 浙南区域 name1 type1 10月 276.173550

10 南区 浙南区域 name1 type1 11月 296.523180

11 南区 浙南区域 name1 type1 12月 290.709000

可以看到,前面的一级大区,二级区域这些内容被填充上内容了。但是月份和销售额还是没有列名。

In: df4.columns = ['primary_area', 'sub_area', 'sales_man',

'product_specifications', 'month', 'target']

df4

Out:

primary_area sub_area sales_man product_specifications month target

0 南区 浙南区域 name1 type1 1月 222.392385

1 南区 浙南区域 name1 type1 2月 110.469420

2 南区 浙南区域 name1 type1 3月 207.566226

3 南区 浙南区域 name1 type1 4月 208.341450

这样就完成了一个多项索引的二维表到一维表的转换。可以看到使用pandas方便快捷,最关键的是能处理excel不太方便的地方。

后记

到这里,今天的内容已经完结了,可能还有朋友说,你标题不是说的要讲一维表和二维表相互转换吗?怎么只讲了二维表到一维表?其实一维表到二维表是最简单的内容,在excel里主要涉及到就是透视表,而pandas也提供了类似透视表的功能, 那就是pivot_table函数。这个就可以留给朋友们自己去研究了。如果有需要可以关注公众号留言给我,我们在一篇文章里再讲讲。

python一维列表变二维列表_使用Python轻松应对一维表与二维表相互转换相关推荐

  1. java 3行4列二维数组_输入一个3行4列矩阵到二维数组中,并打印出来

    输入一个M行M列的二维数组,计算四周元素之和 设置数组S(M,M),M>1,ssum=s(1,1)+s(M,M)+s(1,M)+s(M,1)ifM>2fori=2toM-1ssum=ssu ...

  2. python多元回归 导出参数统计结果_如何从统计模型中WLS回归的二维参数得到检验的预测...

    我使用statsmodels递增地增加WLS regression functions的参数.在 我有一个10x3的数据集X,我这样声明:X = np.array([[1,2,3],[1,2,3],[ ...

  3. mysql编程的二维数组_调出mysql中数据,输出一个二维数组的表格

    1.使用DDL语句创建数据库.创建表. mysql> show databases; +--------------------+ | Database | +----------------- ...

  4. python二维表转一维表_Excel、Power BI及Python系列:使用Power BI转化一维表与二维表...

    上篇文章,老海分享了如何使用Excel完成一维表与二维表之间的转化 本篇老家继续分享使用Power BI来完成一维表与二维表的转化操作. 可能很多小伙伴,不太了解Power BI Power BI是什 ...

  5. python api文档生成二维码_使用Python第三方库生成二维码

    本文主要介绍两个可用于生成二维码的Python第三方库:MyQR和qrcode. MyQR的使用: 安装: pip install MyQR 导入: from MyQR import myqr imp ...

  6. python myqr制作二维码生成器_用Python生成动态二维码,只要5行代码,拥有你的个性二维码!...

    原标题:用Python生成动态二维码,只要5行代码,拥有你的个性二维码! 前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. P ...

  7. python生成二维码_用python生成二维码

    python中有一个好玩的库,不仅可以生成各种花色的二维码,还可以生成动态二维码. MyQR是一个能够生成自定义二维码的第三方库,可以根据需要生成普通二维码.带图片的艺术二维码,也可以生成动态二维码 ...

  8. 二维分类教案_幼儿园中班数学教案中班数学教案二维排序——师乐汇幼儿教师教育网...

    中班数学教案:二维排序 一.活动目标: 1. 在分类的基础上初步运用二维排列表进行物品放置. 2. 通过场景设置.温故知新由易到难的课程安排,幼儿能积极参与大胆表达并且根据表格来进行物品放置. 3.在 ...

  9. python红楼梦人物词频统计_用 Python 分析《红楼梦》

    1 前言 两个月以来,我通过互联网自学了一些文本处理的知识,用自然语言处理和机器学习算法对<红楼梦>进行了一些分析.这个过程中我找到了一些有趣的发现,所以我想写一篇文章,既㲌与大家分享和讨 ...

  10. python写手机脚本脱离电脑_让Python在Android系统上飞一会儿:第三节 在电脑上编写程序在手机上运行...

    本节目录 1. 一些传统的方法2. 将程序的代码生成二维码图片3. 使用手机扫描生成的二维码,并将其转化为py脚本 前言 最手机上写脚本是一件每场辛苦的事情,虽然SL4A人性化的为我们提供了API快速 ...

最新文章

  1. linux服务器LVS/DR模式+nfs
  2. String,StringBuffer与StringBuilder的区别??
  3. 步骤详解安装Apache web服务器
  4. 实时获取ccd图像_四元数数控:CCD视觉检测定位系统在玻璃瓶缺陷的检测
  5. 使用Subversion进行版本控制 附录A
  6. Poj 1011 UVA - 307 Sticks
  7. 安装版win7安装时分区
  8. ab plc软件_【万泉河】PLC垃圾程序赏析2:AB RSLOGIX 5000
  9. Double.valueOf()与Double.parseDouble()两者的区别
  10. 浏览器兼容之JavaScript篇——已在IE、FF、Chrome测试
  11. Linux 文件系统 软/硬链接文件
  12. 堕落 Java vs 新贵 Python,2018 年最应该学习哪一门编程语言?
  13. VS2012统计代码量
  14. OpenCV-Python实战(番外篇)——利用 K-Means 聚类进行色彩量化
  15. intel和amd处理器发展历史
  16. caj文档如何免费转换成pdf格式
  17. 摆脱无效报警?十年运维监控报警优化经验总结
  18. 待我君临天下,定许你一世繁华。
  19. 可过滤多种广告的“ADM(阿呆喵)广告拦截工具
  20. 服务端没有 listen,客户端发起连接建立,会发生什么?

热门文章

  1. sublime text3 verilog代码编写高级操作篇
  2. LANP 配置文件
  3. kali安装有道词典
  4. java实现T检验(Ttest)
  5. wps在任务栏取消显示多个文档的预览
  6. css html5布局方式_创建新HTML5&CSS3单页布局– Rock门户
  7. 码农和程序员之间的5个关键差异
  8. Oracle PL/SQL开发基础(第十五弹:同义词)
  9. 招聘时最看重应聘者的什么特质?
  10. 【架构风格 架构模式 设计模式 概念】