python - 尝试使用多行条件遍历 pandas df
问题描述
提前道歉。我对python很陌生。我创建了一个带有日期时间戳索引的 pandas df。我想根据特定列和下一行中的同一列遍历所有具有条件的行。根据下面的示例,我想根据绝对值检查“Streak”列,例如 3,然后检查下一行以查看 streak 列是否变为负数。
由于时间戳索引,我正在努力查看下一行。我已经尝试过.shift()
无数次尝试使用loc
和iloc
以及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 的比率
解决方案
如果我正确理解了这个问题,那么您想要的是(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
或者
推荐阅读
- c# - unity Internal_xxx 函数
- node.js - 更改 ip Nodejs
- sql - SQL Oracle - 多处理器调度:贪心数分区
- c++ - std::stringstream 不使用格式错误的整数设置故障位
- python - 如何与 Cylon BMS 控制器通信
- javascript - 当我克隆多个下拉列表时如何在jQuery中获取多个下拉列表值
- javascript - (discord.js)如果我输入`>clear 1`,它会清除 100 条消息而不是 1 条,如果我输入`>c @user 1`,它会起作用并且只清除 1 条消息
- php - PHP 和 MYSQL 连接错误
- c - sa_mask 默认值为空吗?
- python - 如何使用 Linux Shell 脚本和 Python 脚本插入空行?