让我们用一个更大的示例:
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
与原始数据帧对齐。
与此[问题]非常相似(http://stackoverflow.com/q/25619297/2087463)。 – tmthydvnprt
df.duplicated可以给我重复的行,但我打算找出如何计算只有第一次发生。 –