【问题标题】:Rolling subtraction in pandas大熊猫的滚动减法
【发布时间】:2018-06-11 13:27:27
【问题描述】:

我正在尝试做类似的事情。

ff = pd.DataFrame({'uid':[1,1,1,20,20,20,4,4,4],
                   'date':['09/06','10/06','11/06',
                           '09/06','10/06','11/06',
                           '09/06','10/06','11/06'],
                   'balance':[150,200,230,12,15,15,700,1000,1500],
                  'difference':[np.NaN,50,30,np.NaN,3,0,np.NaN,300,500]})

我尝试过滚动,但找不到减去的函数或滚动子类,只有 sum 和 var 以及其他统计信息。 有办法吗? 我在想我可以创建两个dfs:一个 - 消除每个 uid 的第一行,第二个 - 消除每个 uid 的最后一行。但老实说,我不知道如何为每个 uid 动态地执行此操作。

【问题讨论】:

  • 为什么有人反对我?!这个问题有什么问题?
  • 您可能被否决了,因为您添加了数据图片而不是生成数据的代码。如果你看看我为什么回答你的问题,我发布了代码来生成你的数据框。接下来甚至现在,修改这个问题以移除数据的图像并添加代码以生成数据以及预期的结果。

标签: python pandas numpy


【解决方案1】:

groupbydiff 一起使用:

df = pd.DataFrame({'uid':[1,1,1,20,20,20,4,4,4],
                   'date':['09/06','10/06','11/06',
                           '09/06','10/06','11/06',
                           '09/06','10/06','11/06'],
                   'balance':[150,200,230,12,15,15,700,1000,1500]})

df['difference'] = df.groupby('uid')['balance'].diff()

输出:

   uid   date  balance  difference
0    1  09/06      150         NaN
1    1  10/06      200        50.0
2    1  11/06      230        30.0
3   20  09/06       12         NaN
4   20  10/06       15         3.0
5   20  11/06       15         0.0
6    4  09/06      700         NaN
7    4  10/06     1000       300.0
8    4  11/06     1500       500.0

【讨论】:

  • 谢谢斯科特!语法仍然让我难以理解,但它完美地工作!我的意思是,似乎数据框甚至不需要知道涉及日期...
  • Diff 以防万一只是在行之间有所不同。此处不考虑日期。如果您的日期没有按顺序排列,那么您需要先对数据框进行排序,然后调用 diff 以获取以前的地雷当前行。
  • 已编辑。但是顺序不一样,可能会产生误导,我不知道如何更改输出数据框中列的顺序,以便差异实际上在最右边。
  • 按您想要的顺序创建您的列表,然后使用 df[listname]。
猜你喜欢
  • 1970-01-01
  • 2017-10-05
  • 1970-01-01
  • 2019-10-26
  • 2019-10-06
  • 2021-06-27
  • 2018-07-30
  • 2017-08-27
  • 2018-08-20
相关资源
最近更新 更多