根据切片中的行数更改 pandas 中切片的值

Change value of a slice in pandas depending on the number of rows in the slice

我有一个 pandas 数据框,看起来像这样

import pandas as pd

df = pd.DataFrame({'Timestamp': ['1642847484', '1642847484', '1642847484', '1642847484', '1642847487', '1642847487','1642847487','1642847487','1642847487','1642847487','1642847487','1642847487', '1642847489', '1642847489', '1642847489'],
                   'value': [11, 10, 14, 20, 3, 2, 9, 48, 5, 20, 12, 20, 56, 12, 8]})

数据是分批收集的,这导致多行具有相同的时间戳。 我需要用时间索引数据帧,为此索引必须具有唯一值。

如您所见,问题是:

我尝试的方法是

  1. 将时间戳乘以 1000 得到微秒
  2. 计算时间步长 i 和下一个时间步长 j 之间的时间 delta = j-i
  3. 统计i和j之间的行数n
  4. 对于 i 和 j 之间的每一行添加 ( 1/n+1 * rank) 秒

预期输出:

        Timestamp  value
0   1642847484000     11
1   1642847484750     10
2   1642847485500     14
3   1642847484000     20
4   1642847487000      3
5   1642847487250      2
6   1642847487500      9
7   1642847487750     48
8   1642847488000      5
9   1642847488250     20
10  1642847488500     12
11  1642847488750     20
12  1642847489000     56
13  1642847489333     12
14  1642847489666      8
15  1642847490000      4

但我找不到有效的方法,我使用了循环,但我有超过 1500 万行

有没有更简单的方法呢?谢谢

IIUC,您想 de-duplicate 使用内插值。

一个简单的方法是 mask 重复项和 interpolate:

s = df['Timestamp'].astype(int)
df['Timestamp2'] = (s.mul(1000)                      # to µs
                     .mask(s.duplicated())           # mask dups
                     .interpolate(downcast= 'infer') # interpolate
                     .astype(str)                    # back to string
                   )

输出:

     Timestamp  value     Timestamp2
0   1642847484     11  1642847484000
1   1642847484     10  1642847484750
2   1642847484     14  1642847485500
3   1642847484     20  1642847486250
4   1642847487      3  1642847487000
5   1642847487      2  1642847487250
6   1642847487      9  1642847487500
7   1642847487     48  1642847487750
8   1642847487      5  1642847488000
9   1642847487     20  1642847488250
10  1642847487     12  1642847488500
11  1642847487     20  1642847488750
12  1642847489     56  1642847489000
13  1642847489     12  1642847489000
14  1642847489      8  1642847489000