1.0: 关于excel数据透视表的数据填充

1.1: 前言

参加某某比赛时,遇到比较复杂的数据填充,当时由于时间限制,加之对excel数据透视表格式的不理解,在比赛中使用了非常笨的方式去填充,在之后写比赛总结时,发现了可以更快速地进行填充,因此写下此文章进行记录。

2.0: 过程

2.1: 数据、任务介绍

该数据是使用excel聚合得到的数据透视表,我们可以看到其中有空缺值。我们需要根据他这一整年,四个季度中没有空缺的值求和取平均,去填充空缺值。但是excel对于这种复杂的操作没有可行的办法,因此使用python,进行数据处理。

由于python无法直接导入excel的数据透视表,因此我们将该数据透视表中删去无关列,得到最终的数据,再使用pd.read_clipboard()函数将其导入,删去无关列后的数据如下:

2.2: 具体过程

2.2.1: 导入数据

frame = pd.read_clipboard(header= None)
frame.head(5)       # 输出前五条数据0        1      2        3      4        5       6   ...      26       27      28       29      30       31     32
0                            Algeria  1292.01 -21.80      NaN    NaN   723.41   36.17  ...   13.51   876.49  -26.29   245.20   -4.90   651.66 -32.58
1                             Angola    93.20   7.46   688.25  68.83   670.01   47.53  ...   41.41   398.18  -19.91   366.34    0.00   878.19  61.47
2                              Benin  1282.29  88.48  2412.11  48.40   739.48   -7.39  ...   30.48  2432.26  -81.39   657.94  -38.64   830.33  -8.30
3                           Botswana   660.12   0.00   953.86  95.39   874.66   78.72  ...  -23.70      NaN     NaN  1154.90  -24.69      NaN    NaN
4                       Burkina Faso  1101.36  30.66      NaN    NaN   745.22  -29.81  ...  -63.30      NaN     NaN   642.20  -18.00      NaN    NaN

这里需要注意的是read_clipboard使用了header= None,表示第一行不是表的列索引,他为我们默认的添加上了从0开始的列索引。

2.2.2: 创建多层索引

# 根据数据透视表,创建多层索引
col = pd.MultiIndex.from_arrays([['2017', '2017', '2017', '2017', '2017', '2017', '2017', '2017','2018', '2018', '2018', '2018', '2018', '2018','2018','2018','2019', '2019', '2019', '2019', '2019', '2019', '2019', '2019','2020', '2020', '2020', '2020', '2020', '2020', '2020', '2020'],['第一季', '第一季', '第二季', '第二季', '第三季', '第三季', '第四季', '第四季','第一季', '第一季', '第二季', '第二季', '第三季', '第三季', '第四季', '第四季','第一季', '第一季', '第二季', '第二季', '第三季', '第三季', '第四季', '第四季','第一季', '第一季', '第二季', '第二季', '第三季', '第三季', '第四季', '第四季'],['销售', '利润', '销售', '利润', '销售', '利润', '销售', '利润','销售', '利润', '销售', '利润', '销售', '利润', '销售', '利润','销售', '利润', '销售', '利润', '销售', '利润', '销售', '利润','销售', '利润', '销售', '利润', '销售', '利润', '销售', '利润',]])
# 将国家名称那一列设置为索引,国家名称对应的列索引为0,上面有介绍
frame.set_index(0, inplace= True)   # inplace= True表示会影响原来的frame,默认是为False。# 设置列
frame.columns = col
frame.columns# 这里只截取了部分的结果, 可以看到我们成功地为其设置了多层索引。
MultiIndex([('2017', '第一季', '销售'),('2017', '第一季', '利润'),('2017', '第二季', '销售'),('2017', '第二季', '利润'),('2017', '第三季', '销售')

2.2.3: 填充数据

创建一个字典,为填充每一年的数据做准备。(这里本来可以使用字符串拼接的方式,去生成每一次填充的索引,但是考虑到阅读效果,还是直接将所有的写出来,方便快速理解。)

dic = {'2017':[('2017', '第一季', '销售'),('2017', '第二季', '销售'),('2017', '第三季', '销售'),('2017', '第四季', '销售')],'2018':[('2018', '第一季', '销售'),('2018', '第二季', '销售'),('2018', '第三季', '销售'),('2018', '第四季', '销售')],'2019':[('2019', '第一季', '销售'),('2019', '第二季', '销售'),('2019', '第三季', '销售'),('2019', '第四季', '销售')],'2020':[('2020', '第一季', '销售'),('2020', '第二季', '销售'),('2020', '第三季', '销售'),('2020', '第四季', '销售')]}
for ls in dic.values():data = frame.loc[:, ls]      # 提取出每一年的数据for index in data.index:data.loc[index, :] = data.loc[index, :].fillna(round(data.loc[index, :].mean(), 2))frame.loc[:, ls] = data

dic.values(),输出的是字典的value,如下:

dic.values()dict_values([[('2017', '第一季', '销售'), ('2017', '第二季', '销售'), ('2017', '第三季', '销售'), ('2017', '第四季', '销售')], [('2018', '第一
季', '销售'), ('2018', '第二季', '销售'), ('2018', '第三季', '销售'), ('2018', '第四季', '销售')], [('2019', '第一季', '销售'), ('2019', '第二季', '销
售'), ('2019', '第三季', '销售'), ('2019', '第四季', '销售')], [('2020', '第一季', '销售'), ('2020', '第二季', '销售'), ('2020', '第三季', '销售'), ('2
020', '第四季', '销售')]])

利润数据的填充,只需要将字典dic中的’销售‘改为’利润‘就行了,代码是一样的。执行完后,我们输出结果,并使用to_excel()函数将其保存到本地,效果如下:

frame.to_excel('本地地址')

3.0: 用简单的数据模拟填充的核心过程

3.1: 创建数据

import pandas as pd
import numpy as np
df =  pd.DataFrame(np.arange(16).reshape(4, 4), columns= ['a', 'b', 'c', 'd])
df.loc[1, ['a', 'b']] = np.nan
df.loc[2, ['a', 'c']] = np.nan
dfa     b     c   d
0   0.0   1.0   2.0   3
1   NaN   NaN   6.0   7
2   NaN   9.0   NaN  11
3  12.0  13.0  14.0  15

3.2: 填充数据

3.2.1原理: 筛选出相应的列,然后for循环对每一行进行平均填充的操作,再将结果覆盖回原来的数据。

3.2.2: 具体过程

for index in df.index:df.loc[index, :] = df.loc[index, :].fillna(round(df.loc[index, :].mean(), 1))dfa     b     c     d
0   0.0   1.0   2.0   3.0
1   6.5   6.5   6.0   7.0
2  10.0   9.0  10.0  11.0
3  12.0  13.0  14.0  15.0

3.2.3: 代码解释

  • df.index: 输出一个由df索引组成的数组。
  • 第一个df.loc[index, :]代表着覆盖源数据的值。
  • 第三个df.loc[index, :].mean()是求第index行的平均值,用来填充。
  • fillna()是用来填充空值。
  • round()函数的使用是为了确保某些无限小数,导致整个数据小数点有很多位。
  • 整条代码的意思是:用第index行数据的平均值,去填充该行空缺的值,然 后再覆盖原来的值。

3.2.4 关于loc函数

我们知道经过loc提取出来的数据,对它进行操作是不会影响到原来的数据的。比如我们用使用loc提取出df的所有列,然后对其进行乘2。

df.loc[:, :] * 2
dfa   b   c   d
0   0   1   2   3
1   4   5   6   7
2   8   9  10  11
3  12  13  14  15

可以看到他是不会改变的。但是如果对他进行下面的操作,原数据就会改变

df.loc[:, :] = df.loc[:, :] * 2
dfa   b   c   d
0   0   2   4   6
1   8  10  12  14
2  16  18  20  22
3  24  26  28  30

关于excel数据透视表的数据填充相关推荐

  1. 计算机Excel设置透视图,职称计算机考试Excel知识点:数据透视表和数据透视图...

    数据透视表和数据透视图 1.创建数据透视表 (1)打开"生产统计A.xls"文档,单击工作表中的任意单元格. (2)选择菜单栏中的[数据]/[数据透视表和数据透视图]命令,打开[数 ...

  2. html行标签并列显示,excel数据透视表_excel数据透视表怎样不显示汇总

    EXCEL中的数据透视表有什么作用,用在哪些方面? excel2010数据透视表怎么做 excel2010数据透视表做法,需要用户打开需要编辑的文件,进入后点击数据透视表,选中我们需要统计的数据,默认 ...

  3. 数据透视表和数据交叉表_数据透视表的数据提取

    数据透视表和数据交叉表 Consider the data of healthcare drugs as provided in the excel sheet. The concept of piv ...

  4. 按英语体育计算机创建透视表,数据透视表和数据透视图概述

    可使用数据透视表汇总.分析.浏览和呈现汇总数据. 数据透视图通过对数据透视表中的汇总数据添加可视化效果来对其进行补充,以便用户轻松查看比较.模式和趋势. 借助数据透视表和数据透视图,用户可对企业中的关 ...

  5. 数据分析——切片器、数据透视表与数据透视图(职场必备)

      在处理小量数据的时候,excel真是一个强大的武器,最近闲下来的时候就温习excel的数据处理,接下来来梳理一下切片器.数据透视表与数据透视图的使用重点,有任何不懂的可以马上私信我.近期也会更新像 ...

  6. excel数据透视表_Excel数据透视表在奥运会上

    excel数据透视表 Are you too old to compete in the Olympics? Maybe you're not as bendy as those 16-year-ol ...

  7. 小福利,带你快速入门sumifs多条件求和函数、设置下拉菜单结合vlookup函数双条件查找数据、excel的切片器(表关联)、数据透视表、数据透视图

    第一部分:利用sumifs函数求得双条件下的求和值 如题,现在需要根据下拉菜单年份和商品来查找利润, 第一步,在年份H3设置数据验证,分别是2019,2020,2021 第二步,在商品H4设置数据验证 ...

  8. excel数据透视表_Excel数据透视表可轻松实现总计

    excel数据透视表 This week I'm working on a client's sales plans for the upcoming fiscal year. They foreca ...

  9. excel数据透视表_Excel数据透视表排序问题

    excel数据透视表 Usually, it's easy to sort an Excel pivot table – just click the drop down arrow in a piv ...

  10. Excel:用宏批量更改数据透视表中数据汇总方式

    有时Excel数据透视表中的值字段较多,我这有64个值字段,因为数据默认汇总方式是"求和".如果要全部更改其汇总方式,如将下图数据透视表中所有值字段的汇总方式由"求和&q ...

最新文章

  1. ubuntu如何设置环境变量,方便log输出路径?(shell文件)
  2. 关于服务器虚化的优势,服务器虚拟化优缺点总结
  3. 【收藏】138条 Vim 命令、操作、快捷键全
  4. VS开发C#窗体应用时怎样设置窗体属性
  5. ubuntu16.04安装VMware网络配置
  6. docker 中不能用vim编辑文件
  7. mssql 2008恢复xp_cmdshell
  8. C++ open 打开文件
  9. Django数据获取操作
  10. 总结——达内视频(二)
  11. 搜狗微信 长链接转微信链接
  12. TRAS为springcloud提供高性能的RPC能力
  13. GCT 英语单词全部核心词汇A-Z
  14. PgSQl 结合 Mybatis 插入 json,及查询,数据库使用 jsonb
  15. Chino with Triangle ( 西工大程序设计创新实践基地春季选拔赛)树形dp
  16. 小班运用计算机教学活动,小班《小蚂蚁》活动教案精选
  17. Ubuntu16.04配置deeplabv3+的pytorch版本
  18. 计算机图形学第四次上机——鼠标回调图形界面交互实现
  19. 从互联网+角度看云计算的现状与未来(2)
  20. windows 建立软连接

热门文章

  1. python几种数据结构_Python中的4种数据结构
  2. 集客家客运维那些事_全网独家汇总!通信工程原理、设备知识大全(2018)
  3. Java适合初学者的编写软件分享
  4. 努比亚修复工具_努比亚 X6 救砖教程 努比亚 NX601J恢复救砖教程
  5. 【测试】15.质量管理体系
  6. 最常用的前端网站模板集合
  7. hdfs命令_HDFS命令
  8. 国产在线三维云CAD:CrownCAD (在线建模CAD软件)
  9. java回调函数(callBack)
  10. 利用diamond进行dbcan数据库建库并进行CAZyme注释(2022.8)