我正在尝试在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] })
所需的数据框如下所示:
答案 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”移位那么多。