天道酬勤,学无止境

Running Count within groups in a dataframe [duplicate]

I have an Orders database for an online shopping platform.

The table I'm working with looks like this, where each line corresponds to one customer/item/date.

OrderHistory <- data.frame(date=c("2015-02-01", "2015-03-01", "2015-04-01", "2015-03-01", "2015-04-01", "2015-05-01", "2015-05-01"), 
            customer=c("A","A","A","B","B","B","B"),
            item=c("Candy", "Coffee", "Coffee", "Candy", "Candy", "Candy", "Coffee" ))

What I would like to get is a running count of the number of times each member has ordered the specific item so I can run analysis on which items are ordered repeatedly by the same customers and which ones are ordered once and never again.

The output would look like

out <- data.frame(date=c("2015-02-01", "2015-03-01", "2015-04-01", "2015-03-01", "2015-04-01", "2015-05-01", "2015-05-01"), 
              member=c("A","A","A","B","B","B","B"),
              item=c("Candy", "Coffee", "Coffee", "Candy", "Candy", "Candy", "Coffee" ),
              count=c(1,1,2,1,2,3,1))

I would love a dplyr solution but I'm open to any suggestions! The exact items on the platform are constantly changing, so the solution would have to be dynamic to account for that.

标签

评论

I believe this should give you what you want

library(dplyr)
OrderHistory %>%
    group_by(customer, item) %>%
    mutate(count = seq(n()))

Source: local data frame [7 x 4]
Groups: customer, item

        date customer   item count
1 2015-02-01        A  Candy     1
2 2015-03-01        A Coffee     1
3 2015-04-01        A Coffee     2
4 2015-03-01        B  Candy     1
5 2015-04-01        B  Candy     2
6 2015-05-01        B  Candy     3
7 2015-05-01        B Coffee     1

You've gotten your "dplyr" answer, but a straightforward way in base R is to use ave:

ave(rep(1, nrow(OrderHistory)), OrderHistory[-1], FUN = seq_along)
# [1] 1 1 2 1 2 3 1

You can also use getanID from my "splitstackshape" package:

library(splitstackshape)
getanID(OrderHistory, c("customer", "item"))
#          date customer   item .id
# 1: 2015-02-01        A  Candy   1
# 2: 2015-03-01        A Coffee   1
# 3: 2015-04-01        A Coffee   2
# 4: 2015-03-01        B  Candy   1
# 5: 2015-04-01        B  Candy   2
# 6: 2015-05-01        B  Candy   3
# 7: 2015-05-01        B Coffee   1

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 为数据框每组内的行创建一个序列号(计数器)[重复](Create a sequential number (counter) for rows within each group of a dataframe [duplicate])
    问题 这个问题已经在这里有了答案: 为数据帧中的组内的行编号(8个答案) 3年前关闭。 我们如何在数据框的每个组中生成唯一的ID号? 这是按“ personid”分组的一些数据: personid date measurement 1 x 23 1 x 32 2 y 21 3 x 23 3 z 23 3 y 23 我希望为“ personid”定义的每个子集中的每一行添加一个具有唯一值的id列,始终以1开头。 这是我想要的输出: personid date measurement id 1 x 23 1 1 x 32 2 2 y 21 1 3 x 23 1 3 z 23 2 3 y 23 3 感谢您的帮助。 回答1 具有参数FUN=seq_along的具有误导性的ave()函数将很好地完成此操作-即使您的personid列未严格排序。 df <- read.table(text = "personid date measurement 1 x 23 1 x 32 2 y 21 3 x 23 3 z 23 3 y 23", header=TRUE) ## First with your data.frame ave(df$personid, df$personid, FUN=seq_along) # [1] 1 2 1 1 2 3 ## Then with another, in
  • count unique combinations of variable values in an R dataframe column [duplicate]
    This question already has answers here: Collapse / concatenate / aggregate a column to a single comma separated string within each group (4 answers) Count number of rows within each group (16 answers) Closed 12 months ago. I want to count the unique combinations of a variable that appear per group. For example: df <- data.frame(id = c(1,1,1,2,2,2,3,3,4,4,4,5,6,6,7,7,7), status = c("a","b","c","a","b","c","b","c","b","c","d","b","b","c","b","c", "d")) > df id status 1 1 a 2 1 b 3 1 c 4 2 a 5 2 b 6 2 c 7 3 b 8 3 c 9 4 b 10 4 c 11 4 d 12 5 b 13 6 b 14 6 c 15 7 b 16 7 c 17 7 d So that, for example
  • Evaluating Spark DataFrame in loop slows down with every iteration, all work done by controller
    I am trying to use a Spark cluster (running on AWS EMR) to link groups of items that have common elements in them. Essentially, I have groups with some elements and if some of the elements are in multiple groups, I want to make one group that contains elements from all of those groups. I know about GraphX library and I tried to use graphframes package (ConnectedComponents algorithm) to resolve this task, but it seams that the graphframes package is not yet mature enough and is very wasteful with resources... Running it on my data set (cca 60GB) it just runs out of memory no matter how much I
  • Apache Spark中的DataFrame相等性(DataFrame equality in Apache Spark)
    问题 假设df1和df2是Apache Spark中的两个DataFrame ,使用两种不同的机制计算得出,例如Spark SQL与Scala / Java / Python API。 是否有一种惯用的方式来确定两个数据帧是否相等(相等,同构),而等效性取决于数据(每行的列名和列值)是否相同(除了行和列的排序)? 这个问题的动机是,通常有很多方法可以计算一些大数据结果,每种方法都有其自身的取舍。 在探索这些折衷方案时,重要的是要保持正确性,因此需要检查有意义的测试数据集的等效性/相等性。 回答1 Apache Spark测试套件中有一些标准方法,但是其中大多数方法都涉及在本地收集数据,如果您要在大型DataFrame上进行相等性测试,那么这可能不是一个合适的解决方案。 首先检查架构,然后可以与df3进行交集并验证df1,df2和df3的计数是否相等(但是,这仅在没有重复行的情况下才有效,如果存在不同的重复行,则此方法仍然可以返回true)。 另一个选择是获取两个DataFrames的基础RDD,映射到(Row,1),执行reduceByKey来计算每个Row的数量,然后将两个结果RDD进行分组,然后进行常规聚合,如果返回,则返回false任何迭代器都不相等。 回答2 Scala(有关PySpark的信息,请参见下文) spark-fast
  • 在循环中评估 Spark DataFrame 会随着每次迭代变慢,所有工作都由控制器完成(Evaluating Spark DataFrame in loop slows down with every iteration, all work done by controller)
    问题 我正在尝试使用 Spark 集群(在 AWS EMR 上运行)来链接具有共同元素的项目组。 本质上,我有一些元素的组,如果一些元素在多个组中,我想创建一个包含所有这些组的元素的组。 我知道 GraphX 库,我尝试使用 graphframes 包( ConnectedComponents算法)来解决这个任务,但它认为graphframes包还不够成熟并且非常浪费资源......在我的数据集上运行它(cca 60GB)无论我如何调整 Spark 参数,如何对数据进行分区和重新分区,或者我创建的集群有多大(图很大),它都会耗尽内存。 于是我自己写了代码来完成任务。 该代码有效并解决了我的问题,但每次迭代都会变慢。 由于有时可能需要大约 10 次迭代才能完成,因此它可能运行很长时间,我无法弄清楚问题是什么。 我从一个表 (DataFrame) item_links ,它有两列: item和group_name 。 项目在每个组中都是唯一的,但在此表中不是。 一个项目可以在多个组中。 如果两个项目各有一行具有相同的组名,则它们都属于同一组。 我首先按项目分组,并为每个项目从它所属的所有组中找到所有组名称中最小的一个。 我将此信息作为额外列附加到原始数据帧。 然后我通过按组名分组并在每个组中找到这个新列的最小值来创建一个新的 DataFrame。 我将这个 DataFrame
  • Mean per group and with count of variables in group [duplicate]
    This question already has answers here: How to use dplyr as alternative to aggregate (2 answers) Count number of rows within each group (16 answers) Closed 1 year ago. I would like to generate a table with groups per range, the mean and the count of variables in each group. I have a data.frame like below: Variable Shap 1 0.10 6 0.50 7 0.30 5 0.40 9 0.10 9 0.25 2 0.24 9 0.23 5 0.22 5 0.21 1 0.20 4 0.19 5 0.18 8 0.17 6 0.16 And would like to get a dataframe like this Range Shap_Avg Counts 0-5 0.2175000 8 6-9 0.2442857 7 For grouping and mean I have this code, but I don´t know how I can include
  • 如何计算熊猫数据框中的重复行?(How to count duplicate rows in pandas dataframe?)
    问题 我正在尝试计算数据框中每种类型的行的重复项。 例如,假设我在熊猫中有一个数据框,如下所示: df = pd.DataFrame({'one': pd.Series([1., 1, 1]), 'two': pd.Series([1., 2., 1])}) 我得到一个看起来像这样的df: one two 0 1 1 1 1 2 2 1 1 我想第一步是找到所有不同的唯一行,我这样做是: df.drop_duplicates() 这为我提供了以下df: one two 0 1 1 1 1 2 现在,我想从上面的df([1 1]和[1 2])中获取每一行,并计算出初始df中每行的次数。 我的结果看起来像这样: Row Count [1 1] 2 [1 2] 1 我应该怎么做最后一步? 编辑: 这是一个更大的示例,它更清楚了: df = pd.DataFrame({'one': pd.Series([True, True, True, False]), 'two': pd.Series([True, False, False, True]), 'three': pd.Series([True, False, False, False])}) 给我: one three two 0 True True True 1 True False False 2 True False False
  • Create a sequential number (counter) for rows within each group of a dataframe [duplicate]
    This question already has answers here: Numbering rows within groups in a data frame (8 answers) Closed 3 years ago. How can we generate unique id numbers within each group of a dataframe? Here's some data grouped by "personid": personid date measurement 1 x 23 1 x 32 2 y 21 3 x 23 3 z 23 3 y 23 I wish to add an id column with a unique value for each row within each subset defined by "personid", always starting with 1. This is my desired output: personid date measurement id 1 x 23 1 1 x 32 2 2 y 21 1 3 x 23 1 3 z 23 2 3 y 23 3 I appreciate any help.
  • 提取数据帧中每个组中的最大值[重复](Extract the maximum value within each group in a dataframe [duplicate])
    问题 这个问题已经在这里有了答案: 在每个组中选择具有最大值的行(17个答案) 3年前关闭。 我有一个带有分组变量(“ Gene”)和一个值变量(“ Value”)的数据框: Gene Value A 12 A 10 B 3 B 5 B 6 C 1 D 3 D 4 对于我的分组变量的每个级别,我希望提取最大值。 因此,结果应该是一个数据帧,每级分组变量只有一行: Gene Value A 12 B 6 C 1 D 4 可以aggregate诀窍吗? 回答1 在R中有很多方法可以做到这一点。以下是其中的一些: df <- read.table(header = TRUE, text = 'Gene Value A 12 A 10 B 3 B 5 B 6 C 1 D 3 D 4') # aggregate aggregate(df$Value, by = list(df$Gene), max) aggregate(Value ~ Gene, data = df, max) # tapply tapply(df$Value, df$Gene, max) # split + lapply lapply(split(df, df$Gene), function(y) max(y$Value)) # plyr require(plyr) ddply(df, .(Gene), summarise
  • 每个值的累计计数(Cumulative count of each value [duplicate])
    问题 这个问题已经在这里有了答案: 为数据帧中的组内的行编号(8个答案) 8个月前关闭。 我想创建每个值出现次数的累积计数器。 例如说我有专栏: id 1 2 3 2 2 1 2 3 这将变成: id count 1 1 2 1 3 1 2 2 2 3 1 2 2 4 3 2 ETC... 谢谢 回答1 dplyr方式: library(dplyr) foo <- data.frame(id=c(1, 2, 3, 2, 2, 1, 2, 3)) foo <- foo %>% group_by(id) %>% mutate(count=row_number()) foo # A tibble: 8 x 2 # Groups: id [3] id count <dbl> <int> 1 1 1 2 2 1 3 3 1 4 2 2 5 2 3 6 1 2 7 2 4 8 3 2 最后以id分组。 如果不希望将其分组,请添加%>% ungroup() 。 回答2 ave函数按组计算一个函数。 > id <- c(1,2,3,2,2,1,2,3) > data.frame(id,count=ave(id==id, id, FUN=cumsum)) id count 1 1 1 2 2 1 3 3 1 4 2 2 5 2 3 6 1 2 7 2 4 8 3 2 我使用id=
  • 在 R [重复] 中创建一个包含出现次数的列(Create a column with a count of occurrences in R [duplicate])
    问题 这个问题在这里已经有了答案: 按组将唯一/不同值的计数添加到原始数据中(3 个答案) 5年前关闭。 我正在尝试向现有数据框添加一列,以便该列定义每个用户购买的不同产品的数量。 一个玩具的例子是 Customer Product 1 Chocolate 1 Candy 1 Soda 2 Chocolate 2 Chocolate 2 Chocolate 3 Insulin 3 Candy 输出应该在哪里 Customer Product #Products 1 Chocolate 3 1 Candy 3 1 Soda 3 2 Chocolate 1 2 Chocolate 1 2 Chocolate 1 3 Insulin 2 3 Candy 2 我想在没有 for 循环的情况下执行此操作,因为我有数百万行,并且需要很长时间。 我已经使用data.table和其他方法来获取每个客户的产品数量,但是我不知道如何轻松地将其作为列添加到现有数据框中。 提前致谢! 回答1 在基础 RI 中会建议ave : within(mydf, { count = ave(Product, Customer, FUN = function(x) length(unique(x))) }) ## Customer Product count ## 1 1 Chocolate 3 ## 2 1
  • 使用groupby获取分组中具有最大值的行(Get the row(s) which have the max value in groups using groupby)
    问题 在按['Sp','Mt']列分组后,如何找到熊猫数据框中所有具有count列最大值的行? 示例1:以下dataFrame,我按['Sp','Mt']分组: Sp Mt Value count 0 MM1 S1 a **3** 1 MM1 S1 n 2 2 MM1 S3 cb **5** 3 MM2 S3 mk **8** 4 MM2 S4 bg **10** 5 MM2 S4 dgd 1 6 MM4 S2 rd 2 7 MM4 S2 cb 2 8 MM4 S2 uyi **7** 预期的输出:获取结果行的数量在组之间最大,例如: 0 MM1 S1 a **3** 2 MM1 S3 cb **5** 3 MM2 S3 mk **8** 4 MM2 S4 bg **10** 8 MM4 S2 uyi **7** 例2:此数据框,我按['Sp','Mt']分组: Sp Mt Value count 4 MM2 S4 bg 10 5 MM2 S4 dgd 1 6 MM4 S2 rd 2 7 MM4 S2 cb 8 8 MM4 S2 uyi 8 对于上面的示例,我想获取每个组中count等于max的所有行,例如: MM2 S4 bg 10 MM4 S2 cb 8 MM4 S2 uyi 8 回答1 In [1]: df Out[1]: Sp Mt Value count 0 MM1 S1
  • Spark DataFrame:orderBy之后的groupBy是否保持该顺序?(Spark DataFrame: does groupBy after orderBy maintain that order?)
    问题 我有一个具有以下结构的Spark 2.0数据框example : id, hour, count id1, 0, 12 id1, 1, 55 .. id1, 23, 44 id2, 0, 12 id2, 1, 89 .. id2, 23, 34 etc. 每个ID包含24个条目(一天中的每个小时一个条目),并使用orderBy函数按id,小时进行排序。 我创建了一个聚合器groupConcat : def groupConcat(separator: String, columnToConcat: Int) = new Aggregator[Row, String, String] with Serializable { override def zero: String = "" override def reduce(b: String, a: Row) = b + separator + a.get(columnToConcat) override def merge(b1: String, b2: String) = b1 + b2 override def finish(b: String) = b.substring(1) override def bufferEncoder: Encoder[String] = Encoders.STRING override
  • 熊猫GroupBy.apply方法复制第一个组(Pandas GroupBy.apply method duplicates first group)
    问题 我的第一个SO问题:我对大熊猫(0.12.0-4)中groupby的apply方法的这种行为感到困惑,它似乎将TWICE函数应用于数据帧的第一行。 例如: >>> from pandas import Series, DataFrame >>> import pandas as pd >>> df = pd.DataFrame({'class': ['A', 'B', 'C'], 'count':[1,0,2]}) >>> print(df) class count 0 A 1 1 B 0 2 C 2 我首先检查groupby函数是否可以正常工作,这似乎很好: >>> for group in df.groupby('class', group_keys = True): >>> print(group) ('A', class count 0 A 1) ('B', class count 1 B 0) ('C', class count 2 C 2) 然后,我尝试对groupby对象应用apply来执行类似的操作,并且两次获得第一行输出: >>> def checkit(group): >>> print(group) >>> df.groupby('class', group_keys = True).apply(checkit) class count 0 A 1
  • 太香了!强烈安利14个Python奇技淫巧
    在工作中我们经常利用Python处理数据,在处理数据过程中经常需要处理分组中最大值的位置、字符串分割、列合并等操作。有些操作偶尔不用也容易遗忘,重复操作非常费时费力。 今天我就把工作中常用到的Python使用技巧归纳一下,将这些技巧整理成文档,以后就可以拿来即用,方便更高效地实现数据分析。如果喜欢,欢迎收藏和分享。 1.行序、列序反转 行序反转最直接的办法是使用loc函数并传递::-1,跟Python中列表反转时使用的切片符号一致 import pandas as pd import numpy as np df = pd.DataFrame(np.random.rand(4,8)) df.loc[::-1].reset_index(drop=True) 列序反转就比较容易了,只需要如下操作 df.loc[:, ::-1] 2.分组里最大值所在的行方法 分为分组中有重复值和无重复值两种。无重复值的情况。 df = pd.DataFrame({'Sp':['a','b','c','d','e','f'], 'Mt':['s1', 's1', 's2','s2','s2','s3'], 'Value':[1,2,3,4,5,6], 'Count':[3,2,5,10,10,6]}) df.iloc[df.groupby(['Mt']).apply(lambda x: x['Count'
  • Python Pandas:具有aggfunc的数据透视表=计数唯一唯一(Python Pandas : pivot table with aggfunc = count unique distinct)
    问题 这段代码: df2 = ( pd.DataFrame({ 'X' : ['X1', 'X1', 'X1', 'X1'], 'Y' : ['Y2', 'Y1', 'Y1', 'Y1'], 'Z' : ['Z3', 'Z1', 'Z1', 'Z2'] }) ) g = df2.groupby('X') pd.pivot_table(g, values='X', rows='Y', cols='Z', margins=False, aggfunc='count') 返回以下错误: Traceback (most recent call last): ... AttributeError: 'Index' object has no attribute 'index' 如何获得数据透视表,其中包含一个DataFrame列与其他两个列的唯一值的计数? 是否有aggfunc计数唯一? 我应该使用np.bincount()吗? 注意我知道' values_counts()但是我需要数据透视表。 编辑:输出应为: Z Z1 Z2 Z3 Y Y1 1 1 NaN Y2 NaN NaN 1 回答1 你的意思是这样吗? >>> df2.pivot_table(values='X', rows='Y', cols='Z', aggfunc=lambda x: len(x.unique()) Z Z1
  • 熊猫分组后并行应用(Parallelize apply after pandas groupby)
    问题 我已经使用rosetta.parallel.pandas_easy来并行化groupby之后的apply ,例如: from rosetta.parallel.pandas_easy import groupby_to_series_to_frame df = pd.DataFrame({'a': [6, 2, 2], 'b': [4, 5, 6]},index= ['g1', 'g1', 'g2']) groupby_to_series_to_frame(df, np.mean, n_jobs=8, use_apply=True, by=df.index) 但是,有没有人想出如何并行化返回DataFrame的函数呢? 如预期的那样,此代码对于rosetta失败。 def tmpFunc(df): df['c'] = df.a + df.b return df df.groupby(df.index).apply(tmpFunc) groupby_to_series_to_frame(df, tmpFunc, n_jobs=1, use_apply=True, by=df.index) 回答1 尽管确实应该将其内置到熊猫中,但这似乎可行 import pandas as pd from joblib import Parallel, delayed import
  • 如何在熊猫数据框中删除唯一行?(How to drop unique rows in a pandas dataframe?)
    问题 我陷入了一个看似简单的问题:在熊猫数据框中删除唯一的行。 基本上,与drop_duplicates()相反。 假设这是我的数据: A B C 0 foo 0 A 1 foo 1 A 2 foo 1 B 3 bar 1 A 当A和B唯一时,我想删除行,即我只保留行1和2。 我尝试了以下方法: # Load Dataframe df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]}) uniques = df[['A', 'B']].drop_duplicates() duplicates = df[~df.index.isin(uniques.index)] 但是我只得到第2行,因为唯一性是0、1和3! 回答1 选择所有重复行的解决方案: 您可以使用带有子集的重复项和参数keep=False来选择所有重复项: df = df[df.duplicated(subset=['A','B'], keep=False)] print (df) A B C 1 foo 1 A 2 foo 1 B 转换解决方案: df = df[df.groupby(['A', 'B'])['A'].transform('size') > 1] print (df) A B C 1
  • 通过熊猫DataFrame分组并选择最常用的值(GroupBy pandas DataFrame and select most common value)
    问题 我有一个包含三个字符串列的数据框。 我知道第三列中唯一的一个值对于前两个的每种组合都有效。 要清理数据,我必须按前两列按数据帧分组,并为每种组合选择第三列的最常用值。 我的代码: import pandas as pd from scipy import stats source = pd.DataFrame({'Country' : ['USA', 'USA', 'Russia','USA'], 'City' : ['New-York', 'New-York', 'Sankt-Petersburg', 'New-York'], 'Short name' : ['NY','New','Spb','NY']}) print source.groupby(['Country','City']).agg(lambda x: stats.mode(x['Short name'])[0]) 最后一行代码不起作用,它显示“ Key error'Short name'”,如果我尝试仅按城市分组,则会收到一个AssertionError。 我该如何解决? 回答1 您可以使用value_counts()获取计数系列,并获取第一行: import pandas as pd source = pd.DataFrame({'Country' : ['USA', 'USA', 'Russia'
  • Python Multiprocessing a large dataframe on Linux
    As shown in the title, I have a big data frame (df) that needs to be processed row-wise, as df is big (6 GB), I want to utilize the multiprocessing package of python to speed it up, below is a toy example, given my writing skill and complexity of the task, I'll describe what I want to achieve briefly and levea the details for the code. The original data is df, from which I want to perform some row-wise analysis(order does not matter) that requires not just the focal row itself but other rows that satisfy certain conditions. Below are the toy data and my code, import pandas as pd import numpy