【问题标题】:Parse every element in a Dataframe解析数据框中的每个元素
【发布时间】:2022-11-27 23:21:20
【问题描述】:

我有一个大约 3700 行的数据框。我使用了 if 循环并给出了我的条件。代码已执行,但我只得到一个元素。我想要检查整个 Dataframe 并在我的条件下打印所有元素。

for i in df:
    i=0
        div = "Divergence spotted at "
    
    if (df.High[i] < df.High[i+1]) and (df.RSI[i] > df.RSI[i+1]) :
        
        print(f'{div}{i}')
        
        i=i+1
        break
    if (df.High[i] > df.High[i+1]) and (df.RSI[i] < df.RSI[i+1]) :
        
        print(f'{div}{i}')
        
        i=i+1
        break
    else:
        print("no divergence spotted")

My Output 我的代码在打印第一个元素后退出。我希望它检查整个 Dataframe 并打印满足我条件的多个元素。

【问题讨论】:

  • 请提供您的 DataFrame 的一个小示例和匹配的预期输出
  • 你在每个“如果”中打破循环,你期望什么?

标签: python dataframe loops for-loop if-statement


【解决方案1】:

您正在使用 break,这会在第一个分歧处停止。

你宁愿需要:

out = []
for i in range(len(df)-1):
    div = "Divergence spotted at "
    
    if (df.High[i] < df.High[i+1]) and (df.RSI[i] > df.RSI[i+1]) :
        
        out.append(f'{div}{i}')
    if (df.High[i] > df.High[i+1]) and (df.RSI[i] < df.RSI[i+1]) :
        
        out.append(f'{div}{i}')
    else:
        out.append('')
out.append('')

输出:['Divergence spotted at 0', '', '', '', '', 'Divergence spotted at 4', '']

但是使用循环是低效的,矢量解决方案是:

m = (np.sign(df['High'].diff(-1).fillna(0))
       .ne(np.sign(df['RSI'].diff(-1).fillna(0)))
     )
df['divergence'] = np.where(m, 'divergence spotted', '')

输出:

   High  RSI          divergence
0     1    2  divergence spotted
1     2    1                    
2     3    2                    
3     2    1                    
4     3    2  divergence spotted
5     1    3                    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    相关资源
    最近更新 更多