汇总数据集中所有重复值

Posted

技术标签:

【中文标题】汇总数据集中所有重复值【英文标题】:Summing up all repeated values in a dataset 【发布时间】:2022-01-07 09:37:33 【问题描述】:

我有一个数据集,其中的一列中有一个人的姓名,而另一列中有她为给定服务支付的金额。我想建立一个列表,其中包含所有人的姓名,这些人的姓名由他们支付的总金额决定,而不管他们执行的服务如何。示例:

Ann     100
John    200
Matt    150
John    150
John    150
Ann     300
Erik    150

===========
John    500
Ann     400
Matt    150
Erik    150

我认为这涉及查找该人姓名的所有重复实例,然后将支付的值存储在列中,最终总结所有内容。问题是我的列表太大,无法检查个人姓名。也就是说,我不能为要检查的每个名称定义一个特定的字符串,而是希望程序自己计算重复的实例并以我描述的方式返回指定的列表。有没有办法做到这一点?我懂一点 Python 和 R,所以用这些语言描述的任何方法都会特别有用。

【问题讨论】:

对于 R 方法,请在 How to sum a variable by group 常见问题解答中选择您最喜欢的答案。我建议library(dplyr); your_data %>% group_by(name) %>% summarize(value = sum(value)),在我使用namevalue 的地方填写你的实际列名。 谢谢,我现在知道该采取什么方法了! 【参考方案1】:

如果您将数据集制作成 pandas 数据框,则可以使用 groupby 轻松完成


import pandas as pd
df = pd.DataFrame('name':names, 'paid':paid)


total_pay = df.groupby(by='name').sum()

【讨论】:

非常感谢,这很有帮助! 有一个小问题,总和似乎是连接数字而不是求和。有没有办法解决这个问题?我的号码格式为 XXX.YYY,ZZ。 别担心,我想通了。只需要转换“。”到“”、“”、“到”。并使用 agg(lambda x: x.astype(float).sum()).【参考方案2】:

1.在 R 中使用 mtcars 数据,基本 R 方法将是使用 tapply() 函数并隔离您的名称和值数据的向量(此处分别为 cyl 和 hp)

tapply(mtcars$hp, mtcars$cyl, sum)

2. 我个人会使用 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 用于选择或处理变量(dtcars[, mean(mpg)])和by(和keyby对输出进行排序)允许通过对变量进行分组来完成j-操作。请注意,您首先需要使用 setDT()data.table() 将 data.frame 转换为 data.table。


3. 或者您可以使用 tidyverse 方法,将数据从语句传递到语句。

library(tidyverse)
mtcars %>% 
  group_by(cyl) %>%
  summarize(sum(hp))

【讨论】:

非常感谢!【参考方案3】:

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

【讨论】:

聪明,我在 R 中考虑过类似的事情,但不知道如何实现。谢谢!

以上是关于汇总数据集中所有重复值的主要内容,如果未能解决你的问题,请参考以下文章

合并R中的数据集:对于两个数据集中的每个值,在第三个数据集中创建一个新行[重复]

编写一个函数,返回数据集中所有问题的唯一答案的计数[重复]

从数据集中获取值 到.txt文件(使用Java)[重复]

mysql union和union all的区别

R:从R中的大型数据集中根据列中的值删除行[重复]

从数据集中删除相同的值