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 中的随机位置。
将groupby
与cumcount
一起使用:
- 如果您希望在地址稍后再次出现时继续计数:
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 开始计数:
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 的末尾,以说明这两种方法的区别。
我有以下 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 中的随机位置。
将groupby
与cumcount
一起使用:
- 如果您希望在地址稍后再次出现时继续计数:
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 开始计数:
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 的末尾,以说明这两种方法的区别。