【问题标题】:Get difference values between rows in Pandas DataFrame获取 Pandas DataFrame 中行之间的差异值
【发布时间】:2014-06-02 23:15:22
【问题描述】:

嗨,我有一个来自 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()

但是 diff 也会在时间戳列上执行,我不能让它忽略一列而 保留原始时间戳列。

此外,我不确定将数据转换为我的返回格式是否有效 正如 Pandas 建议不要进行行访问

在我需要的输出格式中获得结果集差异的快速方法是什么?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    为什么设置drop=False?这会将时间戳放在索引中(diff 不会触及它们),但也会留下时间戳的副本作为适当的列,由diff 处理。

    我认为这会满足您的需求:

    diffs = df.set_index('time').diff().reset_index()
    

    既然您提到了 psycopg2,请查看几天前发布的 pandas 0.14 的文档,该文档具有改进的 SQL 功能,包括对 postgresql 的新支持。您可以直接在数据库和 pandas DataFrames 之间进行读写。

    【讨论】:

    • 答案是正确的,但最后我只是直接使用了numpy。由于 pandas 为每一行转换为 Series 然后为所有 NaN 的行返回 NaT 导致了太多问题。
    猜你喜欢
    • 2021-06-16
    • 2016-10-01
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多