在Pandas DataFrame中获取行之间的差异值

2 投票
1 回答
3030 浏览
提问于 2025-04-18 08:17

你好,我从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 的数据框之间直接读写数据。

撰写回答