汇总数据集中所有重复的值

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