尝试遍历具有多个行条件的pandas df

时间:2019-03-27 10:56:25

标签: python pandas python-2.7

提前道歉。我是python的新手。 我创建了一个以日期时间戳为索引的pandas df。我想根据特定列和下一行中的同一列的条件遍历所有行。根据下面的示例,我想针对绝对值(例如3)检查“条纹”列,然后检查下一行以查看条纹列是否变为负数。

由于时间戳索引,我正在努力查看下一行。我尝试了.shift(),并尝试了lociloc以及Timedelta。他们认为后者的问题在于每行的时间戳之间没有一致的差异。

我的df看起来像

             Security      Difference     Buy/Sell     Streak  Price
Date 
2019-02-25       2330           500.0            1          1  238.0
2019-02-26       2330           400.0            1          2  239.0     
2019-02-27       2330           200.0            1          3  239.5
2019-03-05       2330          -600.0           -1         -1  233.0
2019-03-06       2330           190.0            1          1  234.0

我尝试过但失败的代码是

streaklength = 3
for index, row in mergeddf.iterrows():
    currentrow = mergeddf.index.get_loc(index)
    If (mergeddf.iloc[currentrow,’Streak’] >= streaklength & (mergeddf.iloc[Currentrow + 1, ‘Streak’]) == -1:
        Do something

编辑-在输出结果中,我想依次获取原始行的“价格”列和固定行数的列的价格,并返回该比率。

因此对于我的原始示例,其中固定行移动n = 2。我想返回变量ouput1(239.5)和ouput2(234)并返回output1 / output2的比率

1 个答案:

答案 0 :(得分:0)

如果我对问题的理解正确,那么您想要的是(df.Streak >= 3) & (df.Streak.shift(-1) < 0)

稍微更改示例中的第一行以确保同时满足两个条件,这将提供以下内容:

In [15]: df
Out[15]:
            Security  Difference  Buy/Sell  Streak  Price
Date
2019-02-25      2330       500.0         1       3  238.0
2019-02-26      2330       400.0         1       2  239.0
2019-02-27      2330       200.0         1       3  239.5
2019-03-05      2330      -600.0        -1      -1  233.0
2019-03-06      2330       190.0         1       1  234.0

In [16]: (df.Streak >= 3) & (df.Streak.shift(-1) < 0)
Out[16]:
Date
2019-02-25    False
2019-02-26    False
2019-02-27     True
2019-03-05    False
2019-03-06    False
Name: Streak, dtype: bool

要也回答已编辑的问题,则可以使用此掩码获取相关输出:

mask = (df.Streak >= 3) & (df.Streak.shift(-1) < 0)
df['Output1'] = df[mask].Price
df['Output2'] = df[mask].Price / df.shift(-2)[mask].Price

结果如下:

In [139]: df
Out[139]:
            Security  Difference  Buy/Sell  Streak  Price  Output1   Output2
Date
2019-02-25      2330       500.0         1       3  238.0      NaN       NaN
2019-02-26      2330       400.0         1       2  239.0      NaN       NaN
2019-02-27      2330       200.0         1       3  239.5    239.5  1.023504
2019-03-05      2330      -600.0        -1      -1  233.0      NaN       NaN
2019-03-06      2330       190.0         1       1  234.0      NaN       NaN