【问题标题】:Generate Column Value in Pandas based on previous rows根据前几行在 Pandas 中生成列值
【发布时间】:2019-03-21 17:04:45
【问题描述】:

假设我定期进行温​​度测量并将值记录在 Pandas Dataframe 中

day   temperature [F]
0       89          
1       91         
2       93         
3       88            
4       90

现在我想创建另一列,当且仅当前两个值高于某个级别时才设置为 1。在我的场景中,如果两个连续值高于 90,我想创建一个列值 1,从而产生

day   temperature        Above limit?
0       89               0
1       91               0
2       93               1
3       88               0
4       91               0
5       91               1
6       93               1

尽管进行了一些 SO 和 Google 挖掘,但尚不清楚我是否可以在 for 循环中使用 iloc[x]、loc[x] 或其他内容?

【问题讨论】:

    标签: python pandas jupyter


    【解决方案1】:

    您正在寻找 pandas 中的 shift 函数。

    
    import io
    import pandas as pd
    
    data = """
    day   temperature        Expected
    0       89               0
    1       91               0
    2       93               1
    3       88               0
    4       91               0
    5       91               1
    6       93               1
    """
    
    data = io.StringIO(data)
    df = pd.read_csv(data, sep='\s+')
    
    df['Result'] = ((df['temperature'].shift(1) > 90) & (df['temperature'] > 90)).astype(int)
    
    # Validation
    (df['Result'] == df['Expected']).all()
    
    

    【讨论】:

      【解决方案2】:

      试试这个:

      df = pd.DataFrame({'temperature': [89, 91, 93, 88, 90, 91, 91, 93]})
      
      limit = 90
      df['Above'] = ((df['temperature']>limit) & (df['temperature'].shift(1)>limit)).astype(int)
      df
      

      将来,请包含代码进行测试(在本例中为 df 构造线)

      【讨论】:

      • 啊,领先我几分钟。对于数据构建,我经常使用io 库来复制和粘贴示例数据并读入。我很少看到人们发布示例代码来创建他们的数据集:(
      • 我同意,当没有发布示例时,这是一个很好的解决方法。只是对良好做法的评论,因为它使回答变得更加容易。
      • 感谢您在发布 df 构造线时的提醒。我要给自己十下鞭子
      【解决方案3】:
      df['limit']=""
      df.iloc[0,2]=0
      
      for i in range (1,len(df)):
           if df.iloc[i,1]>90 and df.iloc[i-1,1]>90:
                df.iloc[i,2]=1
           else:
                df.iloc[i,2]=0
      

      这里 iloc[i,2] 指的是第 i 行索引和 2 列索引(限制列)。希望这会有所帮助

      【讨论】:

        【解决方案4】:

        使用shift()的解决方案:

        >> threshold = 90
        >> df['Above limit?'] = 0
        >> df.loc[((df['temperature [F]'] > threshold) & (df['temperature [F]'].shift(1) > threshold)), 'Above limit?'] = 1
        >> df
            day temperature [F] Above limit?
        0   0   89              0
        1   1   91              0
        2   2   93              1
        3   3   88              0
        4   4   90              0
        

        【讨论】:

          【解决方案5】:

          尝试使用rolling(window = 2) 然后 apply() 如下:

          df["limit"]=df['temperature'].rolling(2).apply(lambda x: int(x[0]>90)&int(x[-1]> 90))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-06-09
            • 1970-01-01
            • 2022-01-17
            • 2023-03-21
            • 1970-01-01
            • 2016-07-16
            相关资源
            最近更新 更多