【问题标题】:Is there an equivalent of an excel formula in pandas熊猫中是否有等效的excel公式
【发布时间】:2018-10-06 15:46:57
【问题描述】:

我有一个时间序列数据集,我需要找到我所在领域的差异 每一个刻度。

在 excel 中,我可以通过编写公式 B2=A2-A1 并将此公式复制到整个 B 列来轻松完成此操作

示例:

有没有一种简单的方法可以用 pandas 做到这一点?

我考虑过 apply(),但看起来它只能用于系列的 1 个元素

我的另一个选择是从我的列 A 中创建一个 Numpy 数组并通过它运行一个循环。但是,这似乎是一种迂回的方式,如果我需要引用来自不同的元素会变得更加复杂

我需要翻译的实际Excel公式是=IF((A3-A2)>0, (A3-A2), A3+(4294967296-A2))

【问题讨论】:

  • 应用将起作用。看到这个答案:stackoverflow.com/questions/26886653/…
  • 这个答案解释了一种一次查看多个列一个元素的方法。我想一次查看同一列但有两个元素。我错过了什么吗?

标签: python excel pandas numpy


【解决方案1】:

要获得序列的滞后差异,请使用

df['my_column'].diff()

如果您想做不同于 1 的操作,您也可以指定延迟。

查看documentation了解更多信息


编辑 这是解决公式的一种可能方法:

df = pd.DataFrame({'A': [20, 22, 25, 43, 23, 45, 67, 50, 70]})
df['result'] = df['A'].diff()
df['result'][ df['result'] < 0 ] += 2**32  # you can disregard the pandas warning

根据您的逻辑,您可以简单地采用diff,如果结果小于零,则添加常量2**32。并且它应该比几次获取差异更有效(尽管这可能不是一个大问题)。

【讨论】:

  • 太棒了!然而,我真正的需要有点复杂。我试图通过计算 seq 数的差异来计算每分钟通过 tcp 连接发送的字节数。序列号可以翻转。所以我的excel公式看起来真的像 =IF((A3-A2)>0, (A3-A2), A3+(4294967296-A2))
  • @user2251346 查看我的编辑以解决您的以下公式。我相信它应该比np.where 方法更具可读性和效率
  • 你能解释一下为什么你认为它会更有效率吗?
  • @user2251346:当然,jpp 的答案是一个很好的 1 班轮,但是它执行 2 diff 和 1 shift,因为它基本上会为 np.where 创建两个数组(当 true 和当 false 时) )。如果 diff 和 shift 操作代价高昂,例如由于 Series 太长,那么 one-liner 的效率就会降低。我希望我的两行代码也更具可读性,但这更主观。希望对您有所帮助!
  • 知道了。谢谢!
【解决方案2】:

这就是我现在使用 numpy 解决问题的方法

(翻译Excel公式=IF((A3-A2)>0, (A3-A2), A3+(2**32-A2)))

s1=np.array(df[0])
s=s1[1:]-s1[0:-1]
s[s<0]=s[s<0]+(2**32)

我确实觉得在 pandas 中可以有一个更优雅的解决方案。可能是 df.diff() 是否可以采用 lambda 参数?

【讨论】:

    【解决方案3】:

    这可能会有所帮助。我还没有测试过:为此,请提供一些数据(以文本形式)以及所需的输出。

    df[1] = np.where(df[0].diff() > 0, df[0].diff(), df[0].shift() + 2**32 - df[0])
    

    【讨论】:

    • 我测试了你的线路。完全按照我的意愿工作。
    猜你喜欢
    • 2020-08-27
    • 1970-01-01
    • 2017-06-03
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多