熊猫动态Groupby和Shift

时间:2019-08-23 12:33:07

标签: pandas numpy pandas-groupby

我正在尝试在groupby对象中执行动态转换。在这种情况下,我的分组为Account,每个帐户的Valuation列将移动Shift列中指定的行数减去。前段时间有一个类似的问题,但涉及一个累加值,在这里我只想获取值。参见dynamic shift with groupby on dataframe。如果可能的话,由于性能原因,我想避免申请,因为我有数千万行。

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]       })

所需的数据框如下所示:

enter image description here

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

检查一下。

def sh(x):
    s = df.loc[x.index, 'Shift']
    return (x.shift(-s.iloc[0]))
df['Valuation_shifted']= (df.groupby('Account')['Valuation'].apply(sh))

我知道您说过您不想申请。但是在这种情况下,我们不做lambda适用。而是,我们正在执行一个函数,该函数找出每个组中“ Shift”列的第一个值,并将“ Valuation_shifted”移位那么多。