【问题标题】:opposite of df.diff() in pandas与熊猫中的 df.diff() 相反
【发布时间】:2018-07-03 20:44:31
【问题描述】:

我已经搜索了论坛,以寻找一种更简洁的方法来在数据框中创建一个新列,该列是该行与前一行的总和 - 与 .diff() 函数相反,它获取差异。

这就是我目前解决问题的方法

df = pd.DataFrame ({'c':['dd','ee','ff', 'gg', 'hh'], 'd':[1,2,3,4,5]}
df['e']= df['d'].shift(-1)
df['f'] = df['d'] + df['e']

感谢您的想法。

【问题讨论】:

  • 您的解决方案看起来不错,应该很快
  • LOTS 比滚动快- 0.002352657423882435 对于我的原始方法,接受的答案是 0.011872950857238607
  • 符合我的预期
  • @MissBleu 尝试使用更大的数据框。

标签: python pandas


【解决方案1】:

如果由于多索引或其他原因无法使用滚动,您可以尝试使用 .cumsum(),然后使用 .diff(-2) 将 .cumsum() 的结果从之前的两个位置子化。

data = {'a':[1,6,3,9,5,30, 101, 8]}
df = pd.DataFrame(data)
df['opp_diff'] = df['a'].cumsum().diff(2)

    a   opp_diff
0   1   NaN
1   6   NaN
2   3   9.0
3   9   12.0
4   5   14.0
5   30  35.0
6   101 131.0
7   8   109.0

通常要获得 .diff(n) 的倒数,您应该能够执行 .cumsum().diff(n+1)。问题是您将获得 n+1 个作为 NaN 的第一个结果

【讨论】:

    【解决方案2】:

    df.cumsum()

    Example:
    data = {'a':[1,6,3,9,5], 'b':[13,1,2,5,23]}
    df = pd.DataFrame(data)
    
    df = 
        a   b
    0   1   13
    1   6   1
    2   3   2
    3   9   5
    4   5   23
    
    df.diff()
    
    a   b
    0   NaN NaN
    1   5.0 -12.0
    2   -3.0    1.0
    3   6.0 3.0
    4   -4.0    18.0
    
    df.cumsum()
    
    a   b
    0   1   13
    1   7   14
    2   10  16
    3   19  21
    4   24  44
    

    【讨论】:

    • 它与 diff() 完全相反
    【解决方案3】:

    您可以使用窗口大小为 2 的rollingsum

    df['f'] = df['d'].rolling(2).sum().shift(-1)
    
        c  d    f
    0  dd  1  3.0
    1  ee  2  5.0
    2  ff  3  7.0
    3  gg  4  9.0
    4  hh  5  NaN
    

    【讨论】:

    • 这正是我所希望的!谢谢!
    猜你喜欢
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 2016-01-15
    • 2016-12-03
    • 2020-10-24
    • 2018-09-28
    相关资源
    最近更新 更多