【问题标题】:multiple conditions check with dataframe rows using if elif .. checking today's points and yesterdaypoints使用 if elif .. 检查今天的点和昨天的点的多个条件检查数据框行
【发布时间】:2021-03-02 15:30:54
【问题描述】:

朋友们, 我有一个简单的要求来比较两个单独的行(使用 SHIFT 的当天和前一天)。我正在将当天的参考点与前几天的多个点进行比较。下面是excel表格的截图(仅供参考,我只想在python中进行计算)。

我的python代码被跟踪了。

#calculate Low Travel point
    df['1back'] = df['low'].shift(1) 
    if  df['low'] < df['N400_Z2'].shift(1): 
        df['TP_low'] = 'zz2'
    elif df['low'] > df['N400_Z2'].shift(1) and df['low'] < df['N300_Z'].shift(1):
         df['TP_low'] = "Z1"

我得到了跟踪错误。 ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

请指教。提前致谢。

【问题讨论】:

    标签: python


    【解决方案1】:

    所以我进行了更深入的研究,似乎可以使用 pandas where() 方法 (https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.where.html) 来实现所需的行为,该方法采用布尔数组并且该数组为 false它替换为指定的值。因为当布尔数组为 false 时会发生替换,所以我必须在每个过滤器之前添加负号,以防止您的帖子出现所需的条件。

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame(data=np.random.rand(15,4), columns=['low', 'N400_Z2', 'TP_low', 'N300_Z'])
    
    #calculate Low Travel point
    df['1back'] = df['low'].shift(1)
    
    filter_ = df['low'] < df['N400_Z2'].shift(1)
    filter2_ = (df['low'] > df['N400_Z2'].shift(1)) & (df['low'] < df['N300_Z'].shift(1))
    
    df['TP_low'].where(-filter_, 'zz2', inplace=True)
    df['TP_low'].where(-filter2_, 'Z1', inplace=True)
    

    【讨论】:

    • 嗨! Leo,不,我遇到与上述相同的错误
    • 像冠军一样工作!狮子座..谢谢,接下来是我的输出...更多过滤器更清晰 Datetime 2020-12-17 08:30:00 NaN 3250.000000 3263.510010 NaN NaN 2020-12-17 08:45:00 NaN 3252.239990 3259.399902 J2 NaN 2020-12 -17 09:00:00 NaN 3252.175049 3255.250000 W NaN 2020-12-17 09:15:00 NaN 3230.777344 3247.840088 J1 NaN
    【解决方案2】:

    以下是答案.. 感谢 Leo... 将熊猫导入为 pd 将 numpy 导入为 np

    df = pd.DataFrame(data=np.random.rand(15,4), columns=['low', 'N400_Z2', 'TP_low', 'N300_Z'])

    #calculate 低旅行点 df['1back'] = df['low'].shift(1)

    filter_ = df['low'] df['N400_Z2'].shift(1)) & (df['low']

    df['TP_low'].where(-filter_, 'zz2', inplace=True) df['TP_low'].where(-filter2_, 'Z1', inplace=True)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      • 2014-10-26
      • 1970-01-01
      • 2017-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多