2016-05-04 124 views
0
Agent Amount repeat_count 
    A20 50 USD 
    A30 70 USD 
    A60 80 USD 
    A30 70 USD 1 
    A20 57 USD 
    A20 50 USD 

SO,上面是我的数据框的一个小样本。我需要计算连续的重复数据,即那些转移与前一笔交易相同数额的代理商。 例如,A30连续两次转移金额70美元,因此我需要存储计数。 即使A20发送金额为50美元两次,但在它之间它也发送金额57美元。所以,我不想储存它的数量。提前致谢。计算数据帧中重复项的第一次出现

+0

与此[问题]非常相似(http://stackoverflow.com/q/25619297/2087463)。 – tmthydvnprt

+0

df.duplicated可以给我重复的行,但我打算找出如何计算只有第一次发生。 –

回答

1

让我们用一个更大的示例:

Agent Amount 
A20 50 
A30 70 
A60 80 
A30 70 
A20 57 
A20 50 
A30 70 
A30 80 
A30 70 

像往常一样,这样的问题,我们将使用groupby在每个代理独立工作,所以我们可以先解决一个代理的问题。让:

df1 = df[df.Agent == 'A30'] 

时重复同样的量下会发现:

df1.Amount.shift() == df1.Amount 

所以,你可以用cumsum数出现次数:

In [11]: (df1.Amount.shift() == df1.Amount).cumsum() 
Out[11]: 
1 0 
3 1 
6 2 
7 2 
8 2 

让我们应用上述解决原始数据帧:

In [12]: df.groupby('Agent').apply(
      lambda df1: (df1.Amount.shift() == df1.Amount).cumsum() 
     ) 
Out[12]: 
Agent 
A20 0 0 
     4 0 
     5 0 
A30 1 0 
     3 1 
     6 2 
     7 2 
     8 2 
A60 2 0 

为了将结果与原数据帧合并,我们需要删除索引的第一级(代理商):

repeat_count = df.groupby('Agent').apply(
        lambda df1: (df1.Amount.shift() == df1.Amount).cumsum() 
       ) 
pd.concat([df, repeat_count.reset_index(level=0, drop=True)], axis=1) 

功能concat将合并基于索引值,这样的成绩在repeat_count与原始数据帧对齐。

+0

嗨,大部分这看起来像一个非常优雅的解决方案。我以前不知道cumsum()函数。我不确定这是否会只计算重复的第一次出现。 –

+1

如果我的答案适合您,您可以接受它。如果您发现需要调整的案例,请告诉我。 – IanS

+1

@vishalbhatt记住[你也接受点](http://stackoverflow.com/help/accepted-answer)! – tmthydvnprt