在Pandas DataFrame中获取行之间的差异值
你好,我从psycopg2得到了一个结果集,内容如下:
(
(timestamp1, val11, val12, val13, val14),
(timestamp2, val21, val22, val23, val24),
(timestamp3, val31, val32, val33, val34),
(timestamp4, val41, val42, val43, val44),
)
我需要计算每一行的值之间的差异(时间戳这一列除外)。每一行的值要减去上一行的值。第一行的结果应该是:
timestamp, 'NaN', 'NaN' ....
然后这些结果需要以一种通用的对象形式返回,也就是说,像下面这样的对象数组:
Group(timestamp=timestamp, rows=[val11, val12, val13, val14]
我打算用Pandas来计算差异。像下面这样的代码在处理值时效果不错:
df = DataFrame().from_records(data=results, columns=headers)
diffs = df.set_index('time', drop=False).diff()
但是,Pandas的diff函数也会对时间戳这一列进行操作,我无法让它忽略这一列,同时又保留原来的时间戳列。
另外,我不确定将数据转换成我想要的返回格式是否高效,因为Pandas不建议按行访问数据。
那么,有什么快速的方法可以得到我需要的结果集差异,并以我想要的输出格式返回呢?
1 个回答
3
你为什么把 drop=False
设置成这样呢?这样做会把时间戳放到索引里(这样 diff
就不会去碰它们),同时也会保留一份时间戳作为正常的列,供 diff
处理。
我觉得这样做可以达到你想要的效果:
diffs = df.set_index('time').diff().reset_index()
既然你提到了 psycopg2,那就看看刚发布不久的 pandas 0.14 的文档吧,这个版本增强了 SQL 功能,包括对 postgresql 的新支持。你可以在数据库和 pandas 的数据框之间直接读写数据。