查看原文
其他

R与Python手牵手:数据的分组排序

黄天元 R语言中文社区 2019-04-22

作者黄天元,复旦大学博士在读,目前研究涉及文本挖掘、社交网络分析和机器学习等。希望与大家分享学习经验,推广并加深R语言在业界的应用。

邮箱:huang.tian-yuan@qq.com


这次介绍如何在Python与R中进行表格数据的分组排序,也就是分组进行统一运算,以及按照规则进行排列。

Python

#载入模块 import pandas as pd import numpy as np import matplotlib.pylab as plt #载入数据 edu = pd.read_csv('G:/Py/introduction-datascience-python-book-master/files/ch02/educ_figdp_1_Data.csv',                  na_values=':', usecols=['TIME', 'GEO', 'Value'])   #na_values是把“:”符号认为是缺失值的意思


数据可以在以下网址取得:

https://github.com/DataScienceUB/introduction-datascience-python-book

排序

#按照Value从大到小排序,ascending控制正序倒序,inplace控制是否在原数据集进行修改 edu.sort_values(by='Value', ascending=False, inplace=True) edu.head()

TIMEGEOValue
1302010Denmark8.81
1312011Denmark8.75
1292009Denmark8.74
1212001Denmark8.44
1222002Denmark8.44
#返回原始排序 edu.sort_index(axis=0, ascending=True, inplace=True) edu.head()

TIMEGEOValue
02000European Union (28 countries)NaN
12001European Union (28 countries)NaN
22002European Union (28 countries)5.00
32003European Union (28 countries)5.03
42004European Union (28 countries)4.95

由此,我们也可以发现,无论我们怎么进行排序,原始的行号是一直得以保存的,有了这个我们就可以从新恢复数据的排序。

分组

#根据GEO分组得到组内的平均值 group = edu[['GEO', 'Value']].groupby('GEO').mean() group.head()

Value
GEO
Austria5.618333
Belgium6.189091
Bulgaria4.093333
Cyprus7.023333
Czech Republic4.168333

整合

filtered_data = edu[edu['TIME'] > 2005] pivedu = pd.pivot_table(filtered_data, values='Value',                        index=['GEO'], columns=['TIME']) pivedu.head()
TIME200620072008200920102011
GEO





Austria5.405.335.475.985.915.80
Belgium5.986.006.436.576.586.55
Bulgaria4.043.884.444.584.103.82
Cyprus7.026.957.457.987.927.87
Czech Republic4.424.053.924.364.254.51


pivedu.loc[['Spain', 'Portugal'], [2006, 2011]]
TIME20062011
GEO

Spain4.264.82
Portugal5.075.27

R

下面看看R语言中实现相同操作的步骤:

#加载包与数据读取 library(tidyverse) edu = read_csv('G:/Py/introduction-datascience-python-book-master/files/ch02/educ_figdp_1_Data.csv', na=":") %>%                   select(TIME,GEO,Value)-- Attaching packages --------------------------------------- tidyverse 1.2.1 -- √ ggplot2 3.0.0     √ purrr   0.2.5 √ tibble  1.4.2     √ dplyr   0.7.6 √ tidyr   0.8.1     √ stringr 1.3.1 √ readr   1.1.1     √ forcats 0.3.0 -- Conflicts ------------------------------------------ tidyverse_conflicts() -- x dplyr::filter() masks stats::filter() x dplyr::lag()    masks stats::lag() Parsed with column specification: cols(  TIME = col_integer(),  GEO = col_character(),  INDIC_ED = col_character(),  Value = col_double(),  `Flag and Footnotes` = col_character() )

排序

edu %>% arrange(desc(Value)) %>% head
TIMEGEOValue
2010   Denmark8.81  
2011   Denmark8.75  
2009   Denmark8.74  
2001   Denmark8.44  
2002   Denmark8.44  
2004   Denmark8.43  

首先,要知道desc()加在Value前,就会变为降序排列,否则默认为升序。
这里,如果需要在原始数据中变更,赋值给本身即可,其实在原始数据中改数据是极其危险的,不推荐,应该总是用copy来操作,如果出错了随时回到原始备份再次copy。

分组

edu %>% select(GEO,Value) %>%                           #选择指定列 group_by(GEO) %>%                               #按照GEO分组 summarize (Value = mean(Value,na.rm = T)) %>%   #按照分组计算Value的均值,忽略缺失值 head()                                          #取前几行进行展示
GEOValue
Austria       5.618333      
Belgium       6.189091      
Bulgaria      4.093333      
Cyprus        7.023333      
Czech Republic4.168333      
Denmark       8.331667      

整合

#加载包与数据读取 library(tidyverse) edu = read_csv('G:/Py/introduction-datascience-python-book-master/files/ch02/educ_figdp_1_Data.csv', na=":") %>%                   select(TIME,GEO,Value)


GEO200620072008200920102011
Austria       5.40          5.33          5.47          5.98          5.91          5.80          
Belgium       5.98          6.00          6.43          6.57          6.58          6.55          
Bulgaria      4.04          3.88          4.44          4.58          4.10          3.82          
Cyprus        7.02          6.95          7.45          7.98          7.92          7.87          
Czech Republic4.42          4.05          3.92          4.36          4.25          4.51          
Denmark       7.97          7.81          7.68          8.74          8.81          8.75          

分析

同样的步骤,不同的表达,大同小异。

温馨提示

后面所有的教程都会坚持用最简单的例子,这样有一点不会的同学也能够很容易通过查询进行扩展。如果个别函数不知道如何使用,请使用?来查询使用方法,如R中“?spread”。

往期精彩:

R语言二分类问题案例分析:以泰坦尼克号沉船为例

无缝对接Spark与R:Sparklyr系列—探讨属于数据科学家的Spark

R与Python手牵手:数据科学导论系列(包的载入)

R与Python手牵手:数据框的构建、读取与基本描述

今日

推荐

对话大数据系列技术
从破冰到精进
4折优惠等着你
扫描下图二维码即可学习
点击阅读原文加入SVIP可免费学习


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存