为列pandas数据框中第一次/最大的值更改创建dummy by group



我试图通过'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

相关内容

  • 没有找到相关文章

最新更新