其他
R与Python手牵手:数据的分组排序
作者:黄天元,复旦大学博士在读,目前研究涉及文本挖掘、社交网络分析和机器学习等。希望与大家分享学习经验,推广并加深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()
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
下面看看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
TIME | GEO | Value |
---|---|---|
2010 | Denmark | 8.81 |
2011 | Denmark | 8.75 |
2009 | Denmark | 8.74 |
2001 | Denmark | 8.44 |
2002 | Denmark | 8.44 |
2004 | Denmark | 8.43 |
首先,要知道desc()加在Value前,就会变为降序排列,否则默认为升序。
这里,如果需要在原始数据中变更,赋值给本身即可,其实在原始数据中改数据是极其危险的,不推荐,应该总是用copy来操作,如果出错了随时回到原始备份再次copy。
分组
edu %>%
select(GEO,Value) %>% #选择指定列
group_by(GEO) %>% #按照GEO分组
summarize (Value = mean(Value,na.rm = T)) %>% #按照分组计算Value的均值,忽略缺失值
head() #取前几行进行展示
GEO | Value |
---|---|
Austria | 5.618333 |
Belgium | 6.189091 |
Bulgaria | 4.093333 |
Cyprus | 7.023333 |
Czech Republic | 4.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)
GEO | 2006 | 2007 | 2008 | 2009 | 2010 | 2011 |
---|---|---|---|---|---|---|
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 |
Denmark | 7.97 | 7.81 | 7.68 | 8.74 | 8.81 | 8.75 |
分析
同样的步骤,不同的表达,大同小异。
温馨提示
后面所有的教程都会坚持用最简单的例子,这样有一点不会的同学也能够很容易通过查询进行扩展。如果个别函数不知道如何使用,请使用?来查询使用方法,如R中“?spread”。
往期精彩:
今日
推荐