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美元。所以,我不想存储它的数量。提前谢谢。
答案 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
中的结果与原始数据框保持一致。