目 录
1. Tidy Data
我们平时所使用的数据都是经过整理的整齐数据(Tidy Data),然而实际上我们接收到的数据很多都是杂乱无章的,为了进行数据的预处理,我们需要先把数据转换为整齐的数据。看下面一个例子,数据来自美国皮尤研究中心的报告,研究了美国宗教和收入之间的关系。
import pandas as pd
pew_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——列名是一个特征的多个值