首页 > 解决方案 > 尝试使用多行条件遍历 pandas df

问题描述

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

由于时间戳索引,我正在努力查看下一行。我已经尝试过.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 的比率

标签: pythonpandaspython-2.7

解决方案


如果我正确理解了这个问题,那么您想要的是(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

或者


推荐阅读