熊猫连续检测到连续的负数并返回值

时间:2019-09-08 15:48:58

标签: python pandas

我有一个看起来像这样的数据框,我需要提取出现两个连续的负变化值的四分之一。例如。 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

1 个答案:

答案 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