DataFrame俗称数据框,和一般的Excel表格没有多大区别,一般包含索引(行)和表头(列),在python中,由pandas包提供。

这是一个最简单的数据框类型,只包含一级索引和一级表头

如果你的python还没有这个包,请执行以下命令安装:

pip install pandas

这一节,我们要处理的主题是:多级表头和多级目录

先看看他们长什么样子:

表格1:包含二级表头和一级索引

表格二:包含二级索引和一级表头

在Excel里面看这些表格,还没什么特别的感觉,但是,今天我们要在python中来处理这样的表格,下面就开始吧!先说一下内容大概:

1. 如何构造多级表格

多级表格,常来自于实际的需要,许多时候,我们的数据并不是单一的表现形式,会有对比、计算、时间序列等因素。我先给出两个一级表格(也就是我们数据的原始形式)。日期  渠道  用户数 会话数 唯一身份浏览量

0   20180607    (Other) 3839    7324    15223

1   20180607    Direct  30060   35364   72330

2   20180607    Display 2   2   2

3   20180607    Organic Search  50636   57410   144043

4   20180607    Referral    2845    3370    8380

5   20180607    Social  1310    1564    3480

6   20180607    shareasale.com  214 238 568日期  渠道  用户数 会话数 唯一身份浏览量

0   20180531    (Other) 3756    6351    13825

1   20180531    Direct  33195   38812   78479

2   20180531    Display 2   2   2

3   20180531    Email   1   1   3

4   20180531    Organic Search  56003   64026   158187

5   20180531    Referral    3185    3769    9252

6   20180531    Social  3380    3690    7698

7   20180531    shareasale.com  241 268 658

Excel文件链接:https://pan.baidu.com/s/11xIBEm-jfj6o0Hz278Alvw 密码:b515

你需要将这个表格文件下载下来,使用pandas包的read_excel()函数读入。

这2个数据表格分别是2018年6月7号各个渠道的流量数据以及上周同期的数据,我们的目的是要做对比,把这2个表格的数据放到一起,方便对比查看。但我们用脑袋想一下,最方便对比的数据应该是什么样的呢?

前面我们已经给出了2个示例,分别是2级表头和2级索引,其实都起到了对比的作用。下面,我们就分别讲一下这2个表格是怎么做出来的。

1.1  我们先来构建多级表头,如下这样格式

表格1:包含二级表头和一级索引导入包,读入数据import pandas as pdfrom pandas import DataFrame

channel = pd.read_excel('处理多级表格-示例数据.xlsx',sheetname=0)

channel_last_week = pd.read_excel('处理多级表格-示例数据.xlsx', sheetname=1)

一般pandas包导入后会给个pd的别名。读入xlsx格式的数据使用函数pd.read_excel(),第一个参数是文件所在路径, 参数sheetname是指读入这个工作簿当中的哪个sheet,这里有2种写法:第一种是给出sheet的索引号(从左至右从0开始计数),第二种是给出sheet的具体名称,比如:channel = pd.read_excel('处理多级表格-示例数据.xlsx',sheetname='20180607')我们先讲一种最常规的方法:拼接法

显然,我们有三个指标是需要对比的:用户数、会话数、唯一身份浏览量

所以,我们先把渠道设置为索引,使用函数set_index()channel.set_index('渠道', inplace=True)

channel_last_week.set_index('渠道', inplace=True)

注:在pandas中,一般set_xxx类型的函数都会有一个参数inplace,代表是在原对象上修改,还是返回一个新的对象。

这时候,我们的channel就变成了下面这样

image.png

我们来看一下它的index和columns

channel.index

Out[74]: Index(['(Other)', 'Direct', 'Display', 'Organic Search', 'Referral', 'Social', 'shareasale.com'], dtype='object', name='渠道')

channel.columns

Out[75]: Index(['日期', '用户数', '会话数', '唯一身份浏览量'], dtype='object')

如果细心的朋友一定会发现,index和columns的值其实都是属于同一个类: pandas.core.indexes.base.Indextype(channel.columns)Out[76]: pandas.core.indexes.base.Indextype(channel.index)Out[77]: pandas.core.indexes.base.Index现在来看这个日期,它里面的值应该是作为表头的,用来对比三个指标,所以,这里我们可以索性把它从columns中删除掉,到时候直接把它的值拿出来备用yd,yd_la = '20180607','20180531'channel.drop('日期', axis=1, inplace=True)

channel_last_week.drop('日期', axis=1, inplace=True)

第一行中两个变量间加逗号的写法,是一行同时实现2个及以上变量赋值的快捷写法,按顺序一一对应。

可能有人会说,我直接输入日期字符串会显得不够自动化和程序化,万一哪天传入的数据里面日期不是这两个呢?

其实你也可以使用如下的方法获取yd,yd_la = channel.iloc[0,0],channel_last_week.iloc[0,0]

iloc是根据位置进行切片选择的,你也可以使用键名称和索引名称选择yd,yd_la  = channel['日期']['Organic Search'],channel_last_week['日期']['Organic Search']

另外,删除列,除了使用drop外,还可以直接这样操作del channel['日期']

这种写法我直接在原对象上删除,不像drop还可以选择返回删除后的新对象(不影响原对象)

drop除了可以删除列,还可以删除行,只需要设置axis=0(默认),输入索引值即可,比如channel.drop('Direct')

删除了索引值为Direct的行。

现在我们的channal对象是这样的了

image.png开始构造,最直观的做法就是把两个表中同一个指标的数据合并在一起,并且将日期作为底层表头,指标作为第二层表头

DataFrame的合并函数有好几个:merge(基于column名称)、append、concat(基于index的值)...这里我们选择concat.df_user = pd.concat([channel_last_week['用户数'], channel['用户数']],

keys=[yd_la, yd], axis=1).fillna(0)

先看一下结果:

image.png

请忽略小数(显示问题)。可以看到,左边是上周同期的,右边是6月7号的。

concat的参数:第一个list类型,元素是要合并的DataFrame;

keys起到的作用是,其值作为合并后新DataFrame的列名,axis=1的作用是横着合并(等于0的时候代表* 竖这合并,相当于拼接在下方);

最后有个fillna函数,是因为如果有出现索引对不齐的情况,则会匹配出NA值(比如Email这个索引值就不是都有,匹配后20180607这列的值就为0)最后成型

有了上面的合并经验,我们可以把上面的那个合并结果作为一个整体,然后对每一个columns指标都做同样的事情,最后合并起来,其keys的值就是原columns的值,如下所示:df_session = pd.concat([channel_last_week['会话数'], channel['会话数']],

keys=[yd_la, yd], axis=1).fillna(0)

df_uv = pd.concat([channel_last_week['唯一身份浏览量'], channel['唯一身份浏览量']],

keys=[yd_la, yd], axis=1).fillna(0)

channel_together = pd.concat([df_user,df_session,df_uv],keys=['用户数', '会话数', '唯一身份浏览量'],axis=1).fillna(0)

最后来看我们的channel_together 长什么样Out[119]:

用户数               会话数           唯一身份浏览量

20180531 20180607 20180531 20180607 20180531  20180607

(Other)         3756     3839  6351     7324   13825    15223

Direct          33195    30060  38812    35364  78479    72330

Display         2        2.0      2        2      2        2

Email           1        0.0      1        0      3        0

Organic Search  56003    50636.0  64026    57410  158187   144043Referral        3185     2845   3769     3370   9252     8380

Social          3380     1310   3690     1564   7698     3480

shareasale.com  241      214    268      238    658      568

将其输出到Excel中就是目标中的那种格式啦!但是,你这个代码未免有点过长了,而且类似的代码比较多,现在,我们使用列表推导式,重新得到channel_together

发大招啦~~~channel_together = pd.concat([

pd.concat([channel_last_week[column], channel[column]], keys=[yd_la, yd], axis=1)        for column in ['用户数', '会话数', '唯一身份浏览量']], axis=1, keys=['用户数', '会话数', '唯一身份浏览量']).fillna(0)

看到没有,一句代码就解决!

未完待续~~~~

作者:小溏

链接:https://www.jianshu.com/p/f72bc249e872

python 读取多级表头_python之Dataframe:多级表头和索引灵活的处理(一)相关推荐

  1. python读取mat数据_Python几种读取mat格式数据的方法,python几种读取mat

    Python几种读取mat格式数据的方法,python几种读取mat matlab中使用的数据一般会以mat的格式存储,用python读取有以下几种方法 1.使用scipy,具体实现如下: impor ...

  2. python读取pdf表格_Python使用Tabula提取PDF表格数据

    今天遇到一个批量读取pdf文件中表格数据的需求,样式大体是以下这样: python读取PDF无非就是三种方式(我所了解的),pdfminer.pdf2htmlEX 和 Tabula.综合考虑后,选择了 ...

  3. python读取log文件_python文件读写(一)-txt, log, json, csv, xml文件

    1.概述在平时自动化测试工作中,经常会用python对一些文件进行读写操作.其中使用最多的文件格式,就是txt,  log,  json,  csv,  xml,  zip, tar, gz,  ra ...

  4. python读取写入文件_Python读取和写入文件

    1 从文件中读取数据 1.1 读取整个文件 创建名为test的txt文本文件,添加内容如下所示: 1234567890 2345678901 3456789012 实现代码: with open('t ...

  5. python读取大文件目录_Python读取系统文件夹内所有文件并统计数量的方法

    大家先看一下Python os模块中的部分函数 python 路径相关的函数 os.listdir(dirname):列出dirname下的目录和文件 os.getcwd():获得当前工作目录 os. ...

  6. python读取表格数据_Python读取Excel数据并根据列名取值

    一直想将自己接触到的东西梳理一遍,可就是迈不出第一步,希望从这篇总结开始不要再做行动的矮人了. 最近测试过程中需要用到python读取excel用例数据,于是去了解和学习了下xlrd库,这里只记录使用 ...

  7. python中frame用法_python操作dataFrame基本知识点

    1)查看DataFrame数据及属性 df_obj = DataFrame() #创建DataFrame对象 df_obj.dtypes #查看各行的数据格式 df_obj['列名'].astype( ...

  8. python 读取 word 表格_python读取word表格

    python调用com,如何完成word表格操作 word中doc这个格式的文件是微软特有格式,微软没有向外公开任何的api接口文档,只能通过微软提供的OLE组件来提其COM接口,只要你的机器上安装了 ...

  9. python读取grib2数据_python读取grib grib2气象数据

    GRIB是WMO开发的一种用于交换和存储规则分布数据的二进制文件格式,主要用来表示数值天气预报的产品资料.现行的GRIB 码版本有GRIB1 和GRIB2 两种格式.由于小编只接触过GRIB1数据,所 ...

  10. python读取写入文件_Python读取文件,写入文件,打开文件,删除文件,复制文件

    python读取写入文件 In this tutorial we are going to learn about Python File Operations such as python read ...

最新文章

  1. 美多商城之用户中心(收货地址2)
  2. mvc @html.checkbox,MVC - @Html.CheckBoxFor
  3. matplotlib练习
  4. 【C++ grammar】C++简化内存模型
  5. 数学和计算机的应用视频教学反思,数学多媒体教学反思.doc
  6. php5.0相等,关于php:3个相等
  7. 计算机网络匿名性,匿名文件传输协议
  8. python collections,函数等笔记
  9. 从 AVFrame 中取出帧(YUV)保存为 Mat 格式
  10. 【单目标优化求解】基于matlab多阶段动态扰动和动态惯性权重布谷鸟算法求解单目标优化问题【含Matlab源码 1656期】
  11. python随机产生手机号码
  12. Field.Store ,ANALYZED备忘
  13. 计算机发送到桌面快捷方式,win10怎么把计算机放到桌面快捷方式
  14. 锁仓怎么解_期货如何锁仓,解锁以及锁仓的好处
  15. CPT203 软件工程开发 笔记
  16. aspose设置两个word拼接后连续页码
  17. Python 基于tkinter模块的GUI可视化学生成绩管理系统实现(含文件保存)
  18. 力扣(350.121)补9.3
  19. jffs2的目录项查找过程
  20. C# 设置Excel打印选项及打印excel文档

热门文章

  1. 【爱贝观察】移动支付风向转变:拓宽海外市场、渗透三四线城市
  2. 量变到质变所需要的努力
  3. opencv学习笔记五--文件扫描+OCR文字识别
  4. 【C语言刷LeetCode】717. 1 比特与 2 比特字符(E)
  5. 【学习cmake】cmake如何使用链接库 (link_directories, LINK_LIBRARIES, target_link_libraries,FIND_PACKAGE)实践篇2
  6. CS285课程解释_01_为什么是深度强化学习
  7. Locust使用手册--编写一个locustfile
  8. 论文解读:U-Net: Convolutional Networks for Biomedical Image Segmentation
  9. 现在啥软件都有开源,BI 呢?干货推荐
  10. WEB安全基础 - - - XRAY使用