计算数据帧中第一次出现的重复项

时间:2016-05-04 03:31:28

标签: pandas dataframe

    Agent Amount repeat_count
    A20   50 USD
    A30   70 USD
    A60   80 USD
    A30   70 USD   1
    A20   57 USD
    A20   50 USD

所以,上面是我的数据帧的一小部分样本。我需要计算顺序重复项,即那些正在传输与之前事务中相同数量的代理程序。 例如,A30连续两次转移金额70美元,因此我需要存储计数。 即使A20两次发送金额为50美元,但在此之间它也发送金额为57美元。所以,我不想存储它的数量。提前谢谢。

1 个答案:

答案 0 :(得分: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中的结果与原始数据框保持一致。