根据切片中的行数更改 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]})
数据是分批收集的,这导致多行具有相同的时间戳。
我需要用时间索引数据帧,为此索引必须具有唯一值。
如您所见,问题是:
- 时间戳步骤是可变的
- 每个时间步的行数是可变的
我尝试的方法是
- 将时间戳乘以 1000 得到微秒
- 计算时间步长 i 和下一个时间步长 j 之间的时间 delta = j-i
- 统计i和j之间的行数n
- 对于 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
我有一个 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]})
数据是分批收集的,这导致多行具有相同的时间戳。 我需要用时间索引数据帧,为此索引必须具有唯一值。
如您所见,问题是:
- 时间戳步骤是可变的
- 每个时间步的行数是可变的
我尝试的方法是
- 将时间戳乘以 1000 得到微秒
- 计算时间步长 i 和下一个时间步长 j 之间的时间 delta = j-i
- 统计i和j之间的行数n
- 对于 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