首页 > > > R与Python手牵手:数据的分组排序
这次介绍如何在Python与R中进行表格数据的分组排序,也就是分组进行统一运算,以及按照规则进行排列。
#载入模块
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()TIME GEO Value 130 2010 Denmark 8.81 131 2011 Denmark 8.75 129 2009 Denmark 8.74 121 2001 Denmark 8.44 122 2002 Denmark 8.44
#返回原始排序
edu.sort_index(axis=0, ascending=True, inplace=True)
edu.head()TIME GEO Value 0 2000 European Union (28 countries) NaN 1 2001 European Union (28 countries) NaN 2 2002 European Union (28 countries) 5.00 3 2003 European Union (28 countries) 5.03 4 2004 European Union (28 countries) 4.95
由此,我们也可以发现,无论我们怎么进行排序,原始的行号是一直得以保存的,有了这个我们就可以从新恢复数据的排序。
#根据GEO分组得到组内的平均值
group = edu[['GEO', 'Value']].groupby('GEO').mean()
group.head()Value GEO Austria 5.618333 Belgium 6.189091 Bulgaria 4.093333 Cyprus 7.023333 Czech Republic 4.168333
filtered_data = edu[edu['TIME'] > 2005]
pivedu = pd.pivot_table(filtered_data, values='Value',
index=['GEO'], columns=['TIME'])
pivedu.head()TIME 2006 2007 2008 2009 2010 2011 GEO 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 Republic 4.42 4.05 3.92 4.36 4.25 4.51
pivedu.loc[['Spain', 'Portugal'], [2006, 2011]]TIME 2006 2011 GEO Spain 4.26 4.82 Portugal 5.07 5.27
下面看看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)) %>%
headTIMEGEOValue2010 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() #取前几行进行展示GEOValueAustria 5.618333 Belgium 6.189091 Bulgaria 4.093333 Cyprus 7.023333 Czech Republic4.168333 Denmark 8.331667
edu %>% filter(TIME > 2005) %>% spread(key = TIME,value = Value) -> pivedu
pivedu %>% headGEO200620072008200920102011Austria 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”。
原文作者:;如有侵权,请联系管理员删除。