python数据分析——整理数据1

参考资料:活用pandas库

        Hadley Wickham是R社区的知名成员,他在Journal of Statistical Software上发表过一篇关于“整洁数据”的论文,提出了“整洁数据”的概念。数据整理是指对对数据集进行结构化处理,使其易于分析和可视化。它是数据清理的主要目标。整洁数据有助于简化数据分析、可视化和收集工作。

        “整洁数据”通常要满足三个条件:每个观测值成一行;每个变量成一列;每种观测单元构成一张表格。

1、包含一个变量的数据列

(1)固定一列

        如下图所示,对于在表格中展示数据而言,这种格式很好,但是对于数据分析来说,就需要重塑表格。这种数据视图也称为“宽”数据。想要将其转换为整洁的“长”数据格式,必须对DataFrame做“逆透视”/融合/聚合(unpivot、melt、gather)处理(具体取决于所用的统计变成语言)。

import pandas as pd
pew=pd.read_csv(r"...\data\pew.csv")
# 只显示前几列
pew.iloc[:,:6]

        pandas的melt函数可以把DataFrame重塑成整洁的数据格式。melt函数有如下几个参数:

        id_vars:该参数是一个容器(列表、元组或ndarray),所表示的变量会保持原样。

        value_vars:指定想“融合”(或转换为行)的列。它默认“融合”未在id_values参数中指定的所有列。

        var_name:该字符串用于指定value_vars融合后的新列名。默认为variable。

        value_name:该字符串为新列名,代表var_name的值。默认为value。

# 不必指定value_vars,
# 因为相对出“religion”列以外的所有列进行拟透视
pew_long=pd.melt(pew,id_vars='religion')
pew_long.head()

# 可以更改默认值,以便命名进行融合/逆透视的列
pew_long=pd.melt(
    pew,
    id_vars='religion',
    var_name='income',
    value_name='count')
pew_long.head()

(2)固定多列

        当对其余列做“逆透视”时,并非每个数据集都只有一列固定不动。如下图所示:

billboard=pd.read_csv(r"...\data\billboard.csv")
# 查看前几行和前几列
billboard.iloc[0:5,0:16]

billboard_long=pd.melt(
    billboard,
    id_vars=['year','artist','track','time','date.entered'],
    var_name='week',
    value_name='rating')
billboard_long.head()

2、包含多个变量的数据列

# 导入数据
ebola=pd.read_csv(r"...\data\country_timeseries.csv")
# 展示所有列名
print(ebola.columns)
# 输出所选列
ebola.iloc[:5,[0,1,2,3,10,11]]

# 初步整理为长数据,但Cases_Guinea和Death_Guinea代表两类变量
ebola_long=pd.melt(ebola,id_vars=['Date','Day'])
ebola_long

(1)单独拆分和添加列(简单方法)

        本例中,可以依据列名中的下划线(_)拆分感兴趣的列。第一部分是新的状态列,第二部分是新的国家列。对此需要做字符串解析和拆分。

        本例会用到split方法,它会根据戈丁的分隔符拆分字符串。split默认按空格拆分字符串。使用split函数拆分字符串后,拆分结果会保存在一个列表中,这是split方法的工作方式。从输出结果来看,拆分结果都被方括号括起来了。

# 获取variable列
# 访问字符串方法
# 依据分隔符拆分列
variable_split=ebola_long.variable.str.split('_')
# 查看前5行信息
variable_split[:5]

        把列拆分好后,下面把拆分得到的部分指派给一个新的列。不过,首先需要提取status列对应的所有0号元素和country列对应的1号元素。为此。需要再次访问字符串方法,然后使用get方法对各行取想要的索引。

ebola_long['status']=variable_split.str.get(0)
ebola_long['country']=variable_split.str.get(1)
ebola_long.head()

(2)在单个步骤中进行拆分和组合(简单方法)

        下面的讲解基于这样一个事实:返回的向量的顺序和数据的顺序相同。

variable_split=ebola_long.variable.str.split('_',expand=True)
variable_split.columns=['status','country']
ebola_parsed=pd.concat([ebola_long,variable_split],axis=1)
ebola_parsed.head()

(3)在单个步骤中进行拆分和组合(复杂方法)

        下面的讲解依然基于“返回的向量顺序与数据的顺序相同”这一事实。

        前面讲过,拆分返回的是包含两个元素的列表,且每个元素都是新列。利用这一点,可以在每个单个步骤中得到相同的结果。可以使用内置的zip函数把拆分项列表组合在一起。zip函数接受一组迭代器(比如列表或元组),创建一个由输入迭代器组成的新容奇,每个新容器都拥有和出入容器相同的索引。

        可以把zip函数的功能理解为:zip函数把每个传入的容器堆叠起来,创建各种DataFrame,然后以元组形式逐列返回值。

        在python中,可以使用星号操作符(*)对容器拆包。当对未打包的容器应用zip函数时,其效果与之前创建status值和country值时相同。然后可以使用多重赋值把向量同时赋给列。

ebola_long['status'],ebola_long['country']=zip(*ebola_long.variable.str.split("_"))
ebola_long.head()

  • 41
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值