我试图通过'ID'创建一个虚拟变量,该变量从列'值'中的最大或第一个变化开始(无论何时有两个或更多变化)。但是,如果最大的变化发生在2009年或之后,那么虚拟机将从第一次变化开始,而不是最大的变化(例如,ID = 3),如果有的话。输出应该如下所示:
d = {'ID': [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4],
'Year': [2006, 2007, 2008, 2009, 2010, 2006, 2007, 2008, 2009, 2010, 2006, 2007, 2008, 2009, 2010, 2006, 2007, 2008, 2009, 2010],
'Value': [0, 6.25, 31.25, 0, 0, 0, 6.25, 5, 0, 5, 0, 0, 3, 6, 3, 0, 0, 25, 0, 0],
'Dummy' : [0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1]}
df = pd.DataFrame(data = d)
df
我认为你的ID 3的例子是不相关的,因为最大的变化发生在2008年,因为那一年的价值从0-3增加。从2008年到2009年,你会看到同样的变化。因此,您需要包含有关您希望如何处理领带的逻辑(其中领带表示给定ID的最大更改发生在2009年之后和之前)。因此,您可能需要根据反馈更改此内容。
# get the change
df['delta'] = (df['Value'] - df.groupby(['ID'])['Value'].shift(1)).fillna(0)
# get the max change
df['max_delta'] = df.groupby(['ID'])['delta'].transform('max')
# check if max_delta occurred in year prior to 2009
df['conditional'] = np.where(
( df['delta']==df['max_delta']) & (df['Year'] < 2009),
True,
False
)
# anywhere the max value occurred before 2009 we want to start the increment
df.loc[df['conditional']==True,'dummy_calc'] = 1
# foward fill
df['dummy_calc'] = df.groupby(['ID'])['dummy_calc'].ffill()
df['dummy_calc'] = df['dummy_calc'].fillna(0)
# check vs yours
df['check_col'] = df['Dummy'] == df['dummy_calc']
df
输出:
ID Year Value Dummy delta max_delta conditional dummy_calc check_col
0 1 2006 0.00 0 0.00 25.00 False 0.0 True
1 1 2007 6.25 0 6.25 25.00 False 0.0 True
2 1 2008 31.25 1 25.00 25.00 True 1.0 True
3 1 2009 0.00 1 -31.25 25.00 False 1.0 True
4 1 2010 0.00 1 0.00 25.00 False 1.0 True
5 2 2006 0.00 0 0.00 6.25 False 0.0 True
6 2 2007 6.25 1 6.25 6.25 True 1.0 True
7 2 2008 5.00 1 -1.25 6.25 False 1.0 True
8 2 2009 0.00 1 -5.00 6.25 False 1.0 True
9 2 2010 5.00 1 5.00 6.25 False 1.0 True
10 3 2006 0.00 0 0.00 3.00 False 0.0 True
11 3 2007 0.00 0 0.00 3.00 False 0.0 True
12 3 2008 3.00 1 3.00 3.00 True 1.0 True
13 3 2009 6.00 1 3.00 3.00 False 1.0 True
14 3 2010 3.00 1 -3.00 3.00 False 1.0 True
15 4 2006 0.00 0 0.00 25.00 False 0.0 True
16 4 2007 0.00 0 0.00 25.00 False 0.0 True
17 4 2008 25.00 1 25.00 25.00 True 1.0 True
18 4 2009 0.00 1 -25.00 25.00 False 1.0 True
19 4 2010 0.00 1 0.00 25.00 False 1.0 True