如何在熊猫中编写for循环以为前一行创建条件

时间:2018-09-11 02:42:10

标签: python pandas

所以我必须遍历每个季度,确定衰退何时开始和结束。

我制定了以下业务规则

  1. 如果本季度GDP低于前一个季度且前一个季度小于不具有衰退标志的前一个,则标志衰退开始。

  2. 如果本季度GDP>前一个和前一个具有衰退标志或开始衰退标志,则该衰退标志

  3. 如果本季度GDP>上一个和上一个>上一个但上一个2号有衰退标志,则将这两个标记为衰退结束

  4. 其他标记为零的非衰退

我不知道该怎么做,遍历每一行并创建一个if,如果该列是衰退的开始,衰退,衰退的结束或没有衰退,则将生成一个新列来标记

我如何为每一行做 如果上一行是x,而上一行的右侧是Y 另外,如果上一行之前的行是x,而上一行和右边的第1列是Y?

 Output: 
 Quarter GDP  Recession Flag
 1947q1  100  0
 1947q2  110  0
 1947q3  120  1

2 个答案:

答案 0 :(得分:0)

df为包含季度,GDP,经济衰退和国旗的数据框。 .shift()方法应该在这里起作用:

df.columns = ['Quarter', 'GDP', 'Recession', 'Flag']

df['GDP_lag1'] = df['GDP'].shift(1)
df['GDP_lag2'] = df['GDP'].shift(2)
df['flag_lag1'] = df['Recession'].shift(1)
df['flag_lag2'] = df['Recession'].shift(2)

所以现在您的专栏是:

df.columns = ['Quarter', 'GDP', 'Recession', 'Flag', 'GDP_lag1', 'GDP_lag2', 'flag_lag1', 'flag_lag2']

def rec_flag(row):
    gdp = row[1]
    flag = row[2]
    p_gdp = row[4]
    pp_gdp = row[5]
    p_flag = row[6]
    pp_flag = row[7]


    if (gdp < p_gdp) & (p_gdp < pp_gdp) & (p_flag == 0):
       return 1
    elif (gdp > p_gdp) & (p_flag == 1):
       return 1
    elif (gdp > p_gdp) & (p_gdp > pp_gdp) & (pp_flag == 1):
       return 0
    else:
       return 0

df['Flag'] = df.apply(rec_flag) 

答案 1 :(得分:0)

不在我的办公桌前,但这可能有用吗?

df = myDataFrame
prev = None
for index, row in df.iterrows():
    if prev:
        #Check if in a recession currently
        if row[2] = 2:
             if prev[1] > row[1]:
                 row[2]  = 3
        #Check for more conditions
     prev = row
     continue

我在手机上,很难输入,但这应该可以让您开始。如您所见,繁琐的工作会将您带到您想去的地方。