首页 > 解决方案 > Pandas 动态 Groupby 和 Shift

问题描述

我正在尝试在 groupby 对象中执行动态转换。在这种情况下,我的分组是 Account 并且每个帐户的 Valuation 列都会移动减去Shift 列中指定的行数。前段时间有一个类似的问题,但涉及一个 cumsum,在这里我只想要这个值。请参阅dataframe 上的 groupby 动态移位。如果可能的话,出于性能原因,我想避免申请,因为我有数百万行。

import pandas as pd
import numpy as np

    df = pd.DataFrame({
        'Account': [1000001, 1000001, 1000001, 1000001, 1000001, 1000001, 1000001,
                    1000001, 1000001, 1000001, 1000002, 1000002, 1000002, 1000002,
                    1000002, 1000002, 1000002, 1000002, 1000002],
        'Date': ['Jan-18', 'Feb-18', 'Mar-18', 'Apr-18', 'May-18', 'Jun-18',
                 'Jul-18', 'Aug-18', 'Sep-18', 'Oct-18', 'Jan-18', 'Feb-18',
                 'Mar-18', 'Apr-18', 'May-18', 'Jun-18', 'Jul-18', 'Aug-18',
                 'Sep-18'],
        'Valuation':[ 50000,  51000,  52020,  53060,  54122,  55204,  56308,  57434,
                     58583,  59755, 100000, 102000, 104040, 106121, 108243, 110408,
                     112616, 114869, 117166],
        'Shift': [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2]       })

所需的数据框如下所示:

在此处输入图像描述

标签: pandasnumpypandas-groupby

解决方案


您可能拥有比班次更多的独特帐户,因此我们将循环遍历少量班次。给定 on 的排序'Account'where支票 Account 等于转移后的 Account 确保它在组内。

import pandas as pd

s = pd.Series()
for shift in df.Shift.unique():
    u = (df[df.Shift.eq(shift)].Valuation.shift(-shift)
           .where(df.Account.eq(df.Account.shift(-shift))))
    s = s.combine_first(u)

df['Valuation Shifted'] = s

    Account    Date  Valuation  Shift  Valuation Shifted
0   1000001  Jan-18      50000      3            53060.0
1   1000001  Feb-18      51000      3            54122.0
2   1000001  Mar-18      52020      3            55204.0
3   1000001  Apr-18      53060      3            56308.0
4   1000001  May-18      54122      3            57434.0
5   1000001  Jun-18      55204      3            58583.0
6   1000001  Jul-18      56308      3            59755.0
7   1000001  Aug-18      57434      3                NaN
8   1000001  Sep-18      58583      3                NaN
9   1000001  Oct-18      59755      3                NaN
10  1000002  Jan-18     100000      2           104040.0
11  1000002  Feb-18     102000      2           106121.0
12  1000002  Mar-18     104040      2           108243.0
13  1000002  Apr-18     106121      2           110408.0
14  1000002  May-18     108243      2           112616.0
15  1000002  Jun-18     110408      2           114869.0
16  1000002  Jul-18     112616      2           117166.0
17  1000002  Aug-18     114869      2                NaN
18  1000002  Sep-18     117166      2                NaN

推荐阅读