我有一个看起来像这样的数据框,我需要提取出现两个连续的负变化值的四分之一。例如。 2000q4。它必须是第一个负变化的四分之一,而不是2001q1
我还需要前两个正季度的最后一个季度,然后是负季度,例如2002q1
Quarter GDP Change
Quarter
2000q1 2000q1 12359.1 NaN
2000q2 2000q2 12592.5 233.4
2000q3 2000q3 12607.7 15.2
2000q4 2000q4 12679.3 -71.6
2001q1 2001q1 12643.3 -36.0
2001q2 2001q2 12710.3 67.0
2001q3 2001q3 12670.1 -40.2
2001q4 2001q4 12705.3 35.2
2002q1 2002q1 12822.3 117.0
2002q2 2002q2 12893.0 70.7
2002q3 2002q3 12955.8 62.8
2002q4 2002q4 12964.0 8.2
我尝试过使用apply和where。 Apply无效,因为我无法使用shift。
df['bool'] = df['change'].where(df['change'] < 0).where(df['change'].shift() < 0)
我期望的结果是2000q4和2002q1
答案 0 :(得分:0)
您需要正确验证条件:
cond1=(df['Change'].shift(1)>0) & (df['Change']<0) & (df['Change'].shift(-1)<0)
cond2=(df['Change'].shift(2)<0) & (df['Change'].shift(1)>0) & (df['Change']>0)
cond = cond1 | cond2
df1=df[cond1] #to show the rows that verify the condition1
df2=df[cond2] #to show the rows that verify the condition2
现在,如果要在df['bool']
中保存可验证编码使用的值:
df['bool']=df.loc[cond,'Change']
您还可以使用where
:
df['bool'] = df['Change'].where(cond)
输出df1,df2:
df1
Quarter.1 GDP Change
Quarter
2000q4 2000q4 12679.3 -71.6
df2
Quarter.1 GDP Change
Quarter
2002q1 2002q1 12822.3 117.0
输出df
:
Quarter.1 GDP Change bool
Quarter
2000q1 2000q1 12359.1 NaN NaN
2000q2 2000q2 12592.5 233.4 NaN
2000q3 2000q3 12607.7 15.2 NaN
2000q4 2000q4 12679.3 -71.6 -71.6
2001q1 2001q1 12643.3 -36.0 NaN
2001q2 2001q2 12710.3 67.0 NaN
2001q3 2001q3 12670.1 -40.2 NaN
2001q4 2001q4 12705.3 35.2 NaN
2002q1 2002q1 12822.3 117.0 117.0
2002q2 2002q2 12893.0 70.7 NaN
2002q3 2002q3 12955.8 62.8 NaN
2002q4 2002q4 12964.0 8.2 NaN
df[cond]
Quarter.1 GDP Change bool
Quarter
2000q4 2000q4 12679.3 -71.6 -71.6
2002q1 2002q1 12822.3 117.0 117.0