目 录

  • 1. Tidy Data
  • 2. pd.stack()
  • 3. pd.melt()
  • 4. 练习1——列名是一个特征的多个值
  • 5. 练习2——一列数据包含多个特征
  • 6. 练习3—变量存储在行和列中
  • 7. 参考书目

1. Tidy Data

  我们平时所使用的数据都是经过整理的整齐数据(Tidy Data),然而实际上我们接收到的数据很多都是杂乱无章的,为了进行数据的预处理,我们需要先把数据转换为整齐的数据。看下面一个例子,数据来自美国皮尤研究中心的报告,研究了美国宗教和收入之间的关系。

import pandas as pdpew_raw = pd.read_csv('data/tidy-data/pew.csv')
pew_raw.head(10)

  数据每行为不同宗教信仰下收入在不同等级的人的数量。我们希望得到这样一份数据。每行显示信仰某个宗教的名称,收入情况以及频数。下面我们用两种方法实现以下。

2. pd.stack()

  stack()函数可以把列名转化为新一级的索引,正是我们想要的就是把各个收入等级转化为收入这一特征下的不同特征值。但是注意到前面还有一列宗教,所以不能直接进行stack()

# 先把宗教列变为索引
df = pew_raw.set_index('religion')
df.head()

df = df.stack()
df.head()


  现在df有两个索引,我们可以用unstack()函数指定索引列展开数据

df.unstack(0)

df.unstack(1)


  现在的df是一个有二级索引的Series,我们对二级索引命名为income,把数据列命名为frequency

df.index = df.index.rename('income', level = 1)    # 不要忘了指定是哪个索引列
df.name = 'frequency'
df.head()


  接着我们可以用reset_index()函数把Series还原为DataFrame

pew_df = df.reset_index()
pew_df.to_csv('data/tidy-data/pew-tidy1.csv', index = False)
pew_df.head(10)

3. pd.melt()

  除了使用多级索引,Pandas 还提供了另一种更为便捷的方法——melt()。该方法接收以下参数:

  • frame: 需要处理的数据框;
  • id_vars: 保持原样的数据列;
  • value_vars: 需要被转换成变量值的数据列;
  • var_name: 转换后变量的列名;
  • value_name: 数值变量的列名。
pew_df = pd.melt(pew_raw, id_vars=['religion'], value_vars=list(pew_raw.columns)[1:],var_name='income', value_name='frequency')
pew_df = pew_df.sort_values(by='religion')
pew_df.to_csv('data/tidy-data/pew-tidy2.csv', index=False)
pew_df.head(10)

4. 练习1——列名是一个特征的多个值

  Billboard Dataset 2000记录了歌曲首次进入Billboard排行榜Top 100的时间以之后三周内的排名情况。在这个数据集中,每周的排名都被记录到了不同的数据列中。如果我们想要回答“Dancing Queen 这首歌在 2000年7月15日 的排名如何”,就需要结合 date.entered 字段做一些运算才行。下面我们来对这份数据进行整理:

import pandas as pdbb_df = pd.read_csv('data/tidy-data/billboard.csv')
bb_df.head(10)


  我们关心的是歌曲指定时段的排名情况,因此不希望还要经过推算才能知道。所以我们需要对data.entered、wk1、wk2、wk3进行处理

# 先对week进行处理
df = pd.melt(bb_df, id_vars=list(bb_df.columns)[:5], value_vars=list(bb_df.columns)[5:],var_name='week', value_name='rank')
df.head(10)


  这样我们得到了新的特征,进入排名的第几周以及该周的排名情况。我们继续把第几周整理为数字形式,然后据此对时间进行修改。

df.week = df.week.str[-1].astype(int)
df['date.entered'] = pd.to_datetime(df['date.entered']) + pd.to_timedelta((df.week - 1)*7, 'd')    # 突然感觉pandas好强
df = df.rename(columns = {'date.entered': 'date'})
df.head(10)


  这样我们就得到了歌曲在首次进榜后每个时段内的排名情况

df = df.sort_values(by=['track', 'date'])
df.to_csv('data/tidy-data/billboard-time-rank.csv', index=False)
df.head(10)

  查表可知Dancing Queen在2000年7月15日的排名为97,当然也可以通过pandas进行查找

case1 = df.track == 'Dancing Queen'
case2 = pd.to_timedelta(0, 'd') <= pd.to_datetime('2000-07-15')-pd.to_datetime(df.date)
case3 = pd.to_datetime('2000-07-15')-pd.to_datetime(df.date) < pd.to_timedelta(7, 'd')df.loc[(case1 & case2 & case3), 'rank']


  这时的数据中包含很多冗余信息,比如重复的歌手名、歌曲名和歌曲时长。实际上把该表分为两张表更合适,一个记录歌曲信息,一个记录排名信息。我们可以生成一个id作为两张标的唯一标识

# 提取歌曲信息并去掉重复的信息
df_track = df[['artist', 'track', 'time']].drop_duplicates()# 生成标识id
df_track.insert(0, 'id', range(1, len(df_track) + 1))df_track.head(10)

# 为原数据添加id
df = pd.merge(df, df_track, on=['artist', 'track', 'time'])# 按id提取排名信息
df_rank = df[['id', 'date', 'rank']]df_rank.head(10)

df_track.to_csv('data/tidy-data/billboard-track.csv', index=False)
df_rank.to_csv('data/tidy-data/billboard-rank.csv', index=False)

5. 练习2——一列数据包含多个特征

  来自世界卫生组织的肺结核数据集记录了国家、年份、肺结核的发病人群和发病人数,其中发病人群包括性别和年龄段。

import pandas as pdtb_df = pd.read_csv('data/tidy-data/tb.csv')
tb_df.head(10)


  可以看到m014列记录的是某国某年年龄在0~14岁的肺结核发病人数,该列包含了年龄和性别两个特征,这样的数据是不好的,我们需要把两个特征分开。

# 先把这些复合特征视为单一特征——发病人群的多个值进行齐整处理
df = pd.melt(tb_df, id_vars = ['country', 'year'], value_vars = list(tb_df.columns[2:]), var_name = 'groups', value_name = 'cases')
df.head(10)

# 注意到cases列存在一些缺失数据
df = df[df.cases != '---']
df.head(10)

# 提取性别特征
df['sex'] = df['groups'].str[0]
df.head(10)

# 提取年龄特征并修改为更加易读的值
df['age'] = df['groups'].str[1:].map({'014': '0-14','1524': '15-24','2534': '25-34','3544': '35-44','4554': '45-54','5564': '55-64','65': '65+','u': 'unknown'
})# 去掉原来的发病人群特征
df = df[['country', 'year', 'sex', 'age', 'cases']]
df.to_csv('data/tidy-data/tb-tidy.csv', index = False)
df.head(10)

6. 练习3—变量存储在行和列中

  数据来自一个名为 MX17004 的气象站收集的温度数据,我们想要知道某天的最高气温和最低气温。

import pandas as pdwt_df = pd.read_csv('data/tidy-data/weather-all.txt', delimiter = '\t')
wt_df.head(10)

# 先把日期变为一个特征,并提取其中的数字
df = pd.melt(wt_df, id_vars = ['id', 'year', 'month', 'element'], value_vars = list(wt_df.columns[4:]), var_name = 'day', value_name = 'temperature')df.day = df.day.str[1:].astype(int)
df.head(10)

# 把year、month、day整合在一起
df['date'] = df[['year', 'month', 'day']].apply(lambda row: '{:4d}-{:02d}-{:02d}'.format(*row), axis=1)    # month和day需要补0
df.head(10)

# 去掉缺失值
df = df.loc[(df.temperature.notnull()), ['id', 'date', 'element', 'temperature']]
df.head(10)


  我们要做的是把element列的两个值变为两个特征,这就是前面我们用过的unstack()函数,所以需要把id、date和element变为索引

df = df.set_index(['id', 'date', 'element'])
df = df.unstack()
df.head(10)

# 我们用下面的代码把复合列名的内容提取出来
df.columns = list(df.columns.get_level_values('element'))
df.head(10)

# 重新把索引恢复为列名
df = df.reset_index()
df.to_csv('data/tidy-data/weather-tidy.csv', index = True)
df.head(10)

7. 参考书目

  •  Github

【python数据预处理笔记】——整齐数据(Tidy Data)相关推荐

  1. Python数据分析入门笔记5——数据预处理之异常值

    系列文章目录 Python数据分析入门笔记1--学习前的准备 Python数据分析入门笔记2--pandas数据读取 Python数据分析入门笔记3--数据预处理之缺失值 Python数据分析入门笔记 ...

  2. Python数据分析入门笔记9——数据预处理案例综合练习(男篮女篮运动员)

    系列文章目录 Python数据分析入门笔记1--学习前的准备 Python数据分析入门笔记2--pandas数据读取 Python数据分析入门笔记3--数据预处理之缺失值 Python数据分析入门笔记 ...

  3. Python数据分析入门笔记4——数据预处理之重复值

    系列文章目录 Python数据分析入门笔记1--学习前的准备 Python数据分析入门笔记2--pandas数据读取 Python数据分析入门笔记3--数据预处理之缺失值 Python数据分析入门笔记 ...

  4. Python数据分析入门笔记6——数据清理案例练习

    系列文章目录 Python数据分析入门笔记1--学习前的准备 Python数据分析入门笔记2--pandas数据读取 Python数据分析入门笔记3--数据预处理之缺失值 Python数据分析入门笔记 ...

  5. ML之FE:特征工程/数据预处理中的数据异常值的概述、检测方法、处理方法技巧总结之详细攻略

    ML之FE:特征工程/数据预处理中的数据异常值的概述.检测方法.处理方法技巧总结之详细攻略 目录 异常值 异常值的概述(简介/原因/影响) 异常值的检测方法

  6. python数据预处理_Python数据分析——数据预处理的方法

    前言 1. 关于数据集 数据来源:日月光华老师的<Python数据分析从入门到机器学习>的 lianjia 数据. 数据概况: cjtaoshu:成交套数 mendian:门店 cjzon ...

  7. 泰坦尼克号python数据预处理_sklearn preprocessing 数据预处理(OneHotEncoder)

    1. one hot encoder one hot encoder 不仅对 label 可以进行编码,还可对 categorical feature 进行编码: >>> from ...

  8. python数据预处理—数据清洗、数据集成、数据变换、数据归约

    进行数据分析时,需要预先把进入模型算法的数据进行数据预处理.一般我们接收到的数据很多都是"脏数据",里面可能包含缺失值.异常值.重复值等:同时有效标签或者特征需要进一步筛选,得到有 ...

  9. 读书笔记《数据挖掘概念与技术》第2章 数据预处理 2.4 数据集成和变换

    <数据挖掘:概念与技术(原书第2版)> 2.4 数据集成和变换 数据挖掘经常需要数据集成-合并来自多个数据存储的数据.数据还可能需要转换成适于挖掘的形式.本节介绍数据集成和数据变换. 2. ...

最新文章

  1. linux系统下管理网口ip设置密码,Linux系统管理-(12)-网络配置IP命令
  2. face detection[PyramidBox]
  3. careercup-C和C++ 13.2
  4. sql2008 附加数据库时 错误5123
  5. html语言中括号怎么打,HTML语言中括号(尖括号)的字符编码
  6. 成功驱动HD4600-Clover引导
  7. mybatisplus代码生成器3.5.2
  8. Django框架(十九)—— drf:序列化组件(serializer)
  9. java 读取mysql数据库_原生Java操作mysql数据库过程解析
  10. 使用Hibernate的项目中对VO的理解
  11. Centos7系统升级
  12. 【每周论文】Graphene: Packing and Dependency-aware Scheduling for Data-Parallel Clusters(OSDI 2016)
  13. UOJ#449. 【集训队作业2018】喂鸽子(期望dp)
  14. 梦幻西游python验证成语_python正则表达式抓取成语网站
  15. 图片太大怎么办?这3种方法快速压缩图片!
  16. 通过nginx防护可疑攻击的配置指引
  17. python实现图片批量重命名
  18. Android13 设备硬件不带振动马达去掉振动服务
  19. 安装win 11 需要跳过检测所需替换appraiserres.dll文件
  20. LayoutInflater深度解析,学习方式分享

热门文章

  1. 自学网络安全遇到问题怎么解决?
  2. sakura主题美化
  3. 在Vue 中使用 JSX 语法
  4. 大咖面对面 | 范维:从潮玩到NFT
  5. 光学设计CAD:基于ZEMAX的望远物镜优化设计
  6. 计算机的修订模式,如何删除WPS中的红色修订显示?如何退出修订模式?
  7. java输出和opensl,OpenSL的使用
  8. Wear OS手表应用开发教程之-手腕手势-上下甩动手表事件
  9. 茧数SCRM产品介绍系列:智能名片
  10. android查看内核版本号,Android获取系统内核版本的方法