更新DataFrame中的值

时间:2013-11-14 01:20:47

标签: python pandas

我正在修改一些存储不佳的时间序列数据。

有一个列我已经制作了索引,其中的时间戳大多是每15分钟一次,但有些则更短。还有start_secend_sec列,用于指定行所用间隔的哪一部分。

问题是数据创建者假设时间间隔都是15分钟,因此无论实际间隔长度如何,所有start_sec end_sec值都会运行0到900(psuedo-seconds)。我想将这些列组合成开始时间(索引)和实际秒数的长度。

我重新调整事物的非常复杂的解决方案是生成短时间间隔的时间戳列表并将所有内容放入for循环中

for i in short_intervals:
    scale = float(df[ (df.index == i) ].delta.max()) / 60. / 15.
    df[ (df.index == i) ].start_sec = df[(df.index == i)].start_sec * scale
    df[ (df.index == i) ].end_sec = df[(df.index == i)].end_sec * scale

,其中 df.index == i选择给定时间戳的相关行集
df.delta.max()具有间隔的实际长度(以分钟为单位)(因为存储的方式) scale给出了我想要缩放psuedo-seconds以获得实际秒数的值。

所有这一切都很好,我认为我已经完成了,但是

df[ (df.index == i) ].start_sec = df[(df.index == i)].start_sec * scale

实际上并没有更新DataFrame,df与循环之后完全相同。

1 个答案:

答案 0 :(得分:0)

请尝试以下操作:

,而不是使用df.index语法
df.start_sec[i] = df.start_sec[i] * scale
df.end_sec[i] = df.end_sec[i] * scale

甚至:

df.start_sec[i] *= scale
df.end_sec[i] *= scale

在我的测试中,框架使用以下语法分配任何值:

df[(df.index==i)].start_sec = 25

其他人可能解释原因,但可能与此有关:

>>> type(df.A[i])
<type 'numpy.int64'>
>>> type(df[(df.index==i)].A)
<class 'pandas.core.series.Series'>