Pandas 与数据整理

Tidy Data 论文中,Wickham 博士 提出了这样一种“整洁”的数据结构:每个变量是一列,每次观测结果是一行,不同的观测类型存放在单独的表中。他认为这样的数据结构可以帮助分析师更简单高效地进行处理、建模、和可视化。他在论文中列举了 五种 不符合整洁数据的情况,并演示了如何通过 R 语言 对它们进行整理。本文中,我们将使用 Python 和 Pandas 来达到同样的目的。

文中的源代码和演示数据可以在 GitHub(链接)上找到。读者应该已经安装好 Python 开发环境,推荐各位使用 Anaconda 和 Spyder IDE。

列名称是数据值,而非变量名

import pandas as pd
df = pd.read_csv('data/pew.csv')
df.head(10)

宗教信仰与收入 - Pew 论坛

表中的列“<$10k”、“$10-20k”其实是“收入”变量的具体值。变量 是指某一特性的观测值,如身高、体重,本例中则是收入、宗教信仰。表中的数值数据构成了另一个变量——人数。要做到 每个变量是一列 ,我们需要进行以下变换:

df = df.set_index('religion')
df = df.stack()
df.index = df.index.rename('income', level=1)
df.name = 'frequency'
df = df.reset_index()
df.head(10)

宗教信仰与收入 - 整洁版

这里我们使用了 Pandas 多级索引的 stack / unstack 特性。stack() 会将列名转置为新一级的索引,并将数据框(DataFrame)转换成序列(Series)。转置后,我们对行和列的名称做一些调整,再用 reset_index() 将数据框还原成普通的二维表。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值