汇总数据集中所有重复的值
Summing up all repeated values in a dataset
我有一个数据集,其中一列中有一个人的姓名,另一列中有她为特定服务支付的金额。我想建立一个列表,其中包含所有人员的姓名,无论他们提供的服务如何,都按他们获得的总金额排序。示例:
Ann 100
John 200
Matt 150
John 150
John 150
Ann 300
Erik 150
===========
John 500
Ann 400
Matt 150
Erik 150
我认为这涉及到查找此人姓名的所有重复实例,然后存储在该列上支付的值,最终汇总所有内容。问题是我的名单太大,无法检查个人姓名。也就是说,我无法为每个要检查的名称定义一个特定的字符串,而是我希望程序自己计算重复的实例,并以我描述的方式 return 规定的列表。有什么办法吗?我知道一点 Python 和 R,所以用这些语言描述的任何方法都会特别有用。
如果您将数据集制作成 pandas 数据框,则可以使用 groupby
轻松完成
import pandas as pd
df = pd.DataFrame({'name':names, 'paid':paid})
total_pay = df.groupby(by='name').sum()
1. 在 R 中使用 mtcars
数据,基本 R 方法 将使用 tapply()
函数并隔离您的名称和值数据的向量(此处分别为 cyl 和 hp)
tapply(mtcars$hp, mtcars$cyl, sum)
2. 我个人会使用 a data.table 方法 - data.tables 很快而且语法(我认为)直观易读,同时简洁
library(data.table)
dtcars <- data.table(mtcars, keep.rownames=TRUE)
dtcars[, sum(hp), keyby=cyl]
data.table 本质上是类固醇的 data.frame — 它比基础 R data.frame 做得更多,而且效率更高。可以在方括号内通过名称引用变量(例如 cyl
而不是 mtcars$cyl
)。符号 dt[i, j, by]
描述了基本功能 — i
用于对数据进行排序或子集化 (dtcars[order(mpg)]
),j
用于 select 或处理变量 (dtcars[, mean(mpg)]
) 和 by
(以及 keyby
对输出进行排序)允许通过对变量进行分组来完成 j
操作。请注意,您首先需要使用 setDT()
或 data.table()
.
将 data.frame 转换为 data.table
3. 或者您可以使用 a tidyverse 方法,从一个语句到另一个语句的管道数据。
library(tidyverse)
mtcars %>%
group_by(cyl) %>%
summarize(sum(hp))
或在data.table
library(data.table)
df<-data.frame("Name" = c("Ann", "John", "Matt", "John", "John", "Ann", "Erik"), "val"=c(100, 200,150, 150, 150, 300,150))
df <- data.table(df)
df[ , .(val= sum(val)), by = "Name" ]
Name val
1: Ann 400
2: John 500
3: Matt 150
4: Erik 150
我有一个数据集,其中一列中有一个人的姓名,另一列中有她为特定服务支付的金额。我想建立一个列表,其中包含所有人员的姓名,无论他们提供的服务如何,都按他们获得的总金额排序。示例:
Ann 100
John 200
Matt 150
John 150
John 150
Ann 300
Erik 150
===========
John 500
Ann 400
Matt 150
Erik 150
我认为这涉及到查找此人姓名的所有重复实例,然后存储在该列上支付的值,最终汇总所有内容。问题是我的名单太大,无法检查个人姓名。也就是说,我无法为每个要检查的名称定义一个特定的字符串,而是我希望程序自己计算重复的实例,并以我描述的方式 return 规定的列表。有什么办法吗?我知道一点 Python 和 R,所以用这些语言描述的任何方法都会特别有用。
如果您将数据集制作成 pandas 数据框,则可以使用 groupby
轻松完成
import pandas as pd
df = pd.DataFrame({'name':names, 'paid':paid})
total_pay = df.groupby(by='name').sum()
1. 在 R 中使用 mtcars
数据,基本 R 方法 将使用 tapply()
函数并隔离您的名称和值数据的向量(此处分别为 cyl 和 hp)
tapply(mtcars$hp, mtcars$cyl, sum)
2. 我个人会使用 a data.table 方法 - data.tables 很快而且语法(我认为)直观易读,同时简洁
library(data.table)
dtcars <- data.table(mtcars, keep.rownames=TRUE)
dtcars[, sum(hp), keyby=cyl]
data.table 本质上是类固醇的 data.frame — 它比基础 R data.frame 做得更多,而且效率更高。可以在方括号内通过名称引用变量(例如 cyl
而不是 mtcars$cyl
)。符号 dt[i, j, by]
描述了基本功能 — i
用于对数据进行排序或子集化 (dtcars[order(mpg)]
),j
用于 select 或处理变量 (dtcars[, mean(mpg)]
) 和 by
(以及 keyby
对输出进行排序)允许通过对变量进行分组来完成 j
操作。请注意,您首先需要使用 setDT()
或 data.table()
.
3. 或者您可以使用 a tidyverse 方法,从一个语句到另一个语句的管道数据。
library(tidyverse)
mtcars %>%
group_by(cyl) %>%
summarize(sum(hp))
或在data.table
library(data.table)
df<-data.frame("Name" = c("Ann", "John", "Matt", "John", "John", "Ann", "Erik"), "val"=c(100, 200,150, 150, 150, 300,150))
df <- data.table(df)
df[ , .(val= sum(val)), by = "Name" ]
Name val
1: Ann 400
2: John 500
3: Matt 150
4: Erik 150