【问题标题】:Using Python loop for next i rows in dataframe对数据框中的下 i 行使用 Python 循环
【发布时间】:2019-01-14 22:44:30
【问题描述】:

我是一个新的 Python 用户(从 VBA 转换)并且无法弄清楚 Python 的循环函数。我有一个数据框 df,我想根据循环在另一列中满足某些条件来创建一列变量。类似于以下内容:

cycle = 5
dummy = 1

for i = 1 to cycle
    if df["high"].iloc[i] >= df["exit"].iloc[i] and
    df["low"].iloc[i] <= df["exit"].iloc[i] then
        df["signal"] = dummy
        break
    elif i = cycle
        df["signal"] = cycle + 1
        break
    else:
        dummy = dummy + 1
        next i

基本上试图找出循环变量之前的下一列中的哪一列是 if 语句中的条件满足,如果它们从未满足,则分配循环 + 1。所以df["signal"] 将是一列范围为 1 -> (cycle + 1) 的数字。另外,df["exit"] 中有一些 NaN 值,不确定它对循环有何影响。

我在网站上找到了相当广泛的关于行迭代的文档,我觉得 like this is close to where I need to get to,但不知道如何调整它。感谢您的建议!

编辑:包含以下 EXCEL 单元格的数据样本:

high low EXIT test   signal/(OUTPUT COLUMN)
4     3    4    1      1
2     2    2    1      1
2     3    5    0      6
4     3    1    0      5
2     5    2    0      4
5     5    1    0      3
3     1    5    0      2
5     1    5    1      1
1     1    4    0      0

编辑 2:关于脚本的进一步说明 一旦条件

df["high"].iloc[i] >= df["exit"].iloc[i] and
    df["low"].iloc[i] <= df["exit"].iloc[i]

在循环中遇到,它应该为那个特定的实例/行终止。

编辑 3:预期输出

预期的输出是 df["signal"] 列 - 它是循环中条件的第一个实例

 df["high"].iloc[i] >= df["exit"].iloc[i] and
    df["low"].iloc[i] <= df["exit"].iloc[i]

在任何给定的行中都满足。 df["signal"] 中的输出实际上是来自循环或给定迭代的i

【问题讨论】:

  • 您可以发布您的示例数据和输出吗?在这种情况下,你会得到更多的答案和建议。
  • 我不确定我是否理解 thenbreak。我不知道 VBA,但这看起来像是提前终止了。
  • @roganjosh,是的,澄清一下,一旦在循环中满足条件,它就会终止
  • 有趣...我无法可视化预期的输出,因为这似乎表明任何比例的数据都可能未处理。一旦满足某些停止条件,您能否展示您的预期输出?
  • 请在问题本身中发布您期望的输出。

标签: python excel pandas dataframe


【解决方案1】:

这是我解决问题的方法,在执行此操作之前,'gr' 列必须不存在:

# first check all the rows meeting the conditions and add 1 in a temporary column gr
df.loc[(df["high"] >= df["exit"]) & (df["low"] <= df["exit"]), 'gr'] = 1
# manipulate column gr to use groupby after
df['gr'] = df['gr'].cumsum().bfill()
# use cumcount after groupby to recalculate signal
df.loc[:,'signal'] = df.groupby('gr').cumcount(ascending=False).add(1)
# cut the value in signal to the value cycle + 1
df.loc[df['signal'] > cycle, 'signal'] = cycle + 1
# drop column gr
df = df.drop('gr',1)

你会得到

   high  low  exit  signal
0     4    3     4       1
1     2    2     2       1
2     2    3     5       6
3     4    3     1       5
4     2    5     2       4
5     5    5     1       3
6     3    1     5       2
7     5    1     5       1
8     1    1     4       1

注意:最后一行无法正常工作,因为之后再也没有满足条件的行,并且不确定它在完整数据中的情况或如何处理。您可以考虑在以 df['gr'] = ... 开头的行之后添加 df = df.dropna(subset=['gr']) 以删除最后几行,这取决于您。

【讨论】:

    猜你喜欢
    • 2021-12-14
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    相关资源
    最近更新 更多