Python/Pandas 中出现不同的行时重新开始计数列

Restarting count column when different row appears in Python/Pandas

我有以下 Pandas DataFrame,每个地址都有多个金额。每个地址 'amounts' 的计数各不相同。

Index                                           type    amount
0   0xd81c0B4FEA284c908C5700187a67698b416a6bcc  outflow 2.553800e+04
1   0xd81c0B4FEA284c908C5700187a67698b416a6bcc  inflow  1.999650e+05
2   0xd81c0B4FEA284c908C5700187a67698b416a6bcc  inflow  3.896400e+04
3   0x0A5E7C50eA6BB695F2f4e75D97D3381592B59C9F  inflow  3.060000e+05
4   0x2Eec494429E253938A10b2A9eCAD8ee7F603e4Af  outflow 1.569367e+05
5   0x2Eec494429E253938A10b2A9eCAD8ee7F603e4Af  outflow 1.219739e+04

我想创建一个列,每个地址从 1 到 n 行计数,但我不知道如何在下一个地址重新开始计数。

看起来像这样的东西:

Index                                           type    amount          Epoch
0   0xd81c0B4FEA284c908C5700187a67698b416a6bcc  outflow 2.553800e+04    1
1   0xd81c0B4FEA284c908C5700187a67698b416a6bcc  inflow  1.999650e+05    2
2   0xd81c0B4FEA284c908C5700187a67698b416a6bcc  inflow  3.896400e+04    3
3   0x0A5E7C50eA6BB695F2f4e75D97D3381592B59C9F  inflow  3.060000e+05    1
4   0x2Eec494429E253938A10b2A9eCAD8ee7F603e4Af  outflow 1.569367e+05    1
5   0x2Eec494429E253938A10b2A9eCAD8ee7F603e4Af  outflow 1.219739e+04    2

如您所见,当出现具有新地址的行时,纪元计数重新开始。

如何为任意给定数量的 addresses/rows 创建该列的逻辑?

另外:构建DataFrame时有什么需要注意的吗?例如,始终将相同的地址分组,并且不让它们出现在 DataFrame 中的随机位置。

groupbycumcount一起使用:

  1. 如果您希望在地址稍后再次出现时继续计数:
df["Epoch"] = df.groupby("Index").cumcount()+1

>>> df
                                        Index     type     amount  Epoch
0  0xd81c0B4FEA284c908C5700187a67698b416a6bcc  outflow   25538.00      1
1  0xd81c0B4FEA284c908C5700187a67698b416a6bcc   inflow  199965.00      2
2  0xd81c0B4FEA284c908C5700187a67698b416a6bcc   inflow   38964.00      3
3  0x0A5E7C50eA6BB695F2f4e75D97D3381592B59C9F   inflow  306000.00      1
4  0x2Eec494429E253938A10b2A9eCAD8ee7F603e4Af  outflow  156936.70      1
5  0x2Eec494429E253938A10b2A9eCAD8ee7F603e4Af  outflow   12197.39      2
6  0xd81c0B4FEA284c908C5700187a67698b416a6bcc   inflow  199965.00      4
7  0xd81c0B4FEA284c908C5700187a67698b416a6bcc   inflow   38964.00      5
  1. 如果您希望重新出现的地址从 1 开始计数:
df["Epoch"] = df.groupby((df["Index"]!=df["Index"].shift()).cumsum()).cumcount()+1

>>> df
                                        Index     type     amount  Epoch
0  0xd81c0B4FEA284c908C5700187a67698b416a6bcc  outflow   25538.00      1
1  0xd81c0B4FEA284c908C5700187a67698b416a6bcc   inflow  199965.00      2
2  0xd81c0B4FEA284c908C5700187a67698b416a6bcc   inflow   38964.00      3
3  0x0A5E7C50eA6BB695F2f4e75D97D3381592B59C9F   inflow  306000.00      1
4  0x2Eec494429E253938A10b2A9eCAD8ee7F603e4Af  outflow  156936.70      1
5  0x2Eec494429E253938A10b2A9eCAD8ee7F603e4Af  outflow   12197.39      2
6  0xd81c0B4FEA284c908C5700187a67698b416a6bcc   inflow  199965.00      1
7  0xd81c0B4FEA284c908C5700187a67698b416a6bcc   inflow   38964.00      2

注意最后两行的输出差异。我将您示例的第二行和第三行复制到 DataFrame 的末尾,以说明这两种方法的区别。