【问题标题】:Python change column values - each row at a timePython更改列值 - 一次每一行
【发布时间】:2021-07-09 06:27:17
【问题描述】:

我有一个包含以下列的数据框 df

             A   B   C   D
06/09/2019   56 67  33  10
06/10/2019   54 66  47  23
06/11/2019   67 1   43  19
06/12/2019   21 38  8   71

我有两个具有下限 (l) 和上限 (u) 的数据框

lower_df:

             l   
06/09/2019   20 
06/10/2019   12  
06/11/2019   10   
06/12/2019   15 

upper_df:

             u 
06/09/2019   60
06/10/2019   70  
06/11/2019   55  
06/12/2019   50

我想使用两个数据帧(lower_df 和upper_df)的值作为条件,将第一个数据帧(df)列的值更新为 0。这里每一行都是独立的,每一列都与相应的 u & l 值进行比较。小于 l 和大于 u 的值设置为零。

需要结果:

             A   B   C   D
06/09/2019   56  0  33  0
06/10/2019   54 66  47  23
06/11/2019   0  0   43  19
06/12/2019   21 38   0  0

我正在使用以下代码从数据框中提取每一行并将列与此上限和下限进行比较:

for i in range(0,len(df)):
  ul=upper_df.iloc[i]
  ll=lower_df.iloc[i]
  df.iloc[i][df.iloc[i]<ll[0]]=0
  df.iloc[i][df.iloc[i]>ul[0]]=0

但这并没有反映任何变化, df 保持原样。代码是否正确?如果不是,那么正确的方法是什么。这个数据集很大(很多列,这是一个例子),我正在寻找一种更聪明的方法来做到这一点。

【问题讨论】:

    标签: python python-3.x pandas dataframe numpy


    【解决方案1】:

    使用DataFrame.maskDataFrame.lt 比较和 DataFrame.gt| 链接为按位OR

    df = df.mask(df.lt(lower_df['l'], axis=0) | df.gt(upper_df['u'], axis=0), 0)
    print (df)
                 A   B   C   D
    06/09/2019  56   0  33   0
    06/10/2019  54  66  47  23
    06/11/2019   0   0  43  19
    06/12/2019  21  38   0   0
    

    【讨论】:

      【解决方案2】:

      IIUC,这是另一种方式:

      df = df.mul((lower_df.values < df.values) & (
          df.values < upper_df.values).astype(int))
      

      输出:

                   A   B   C   D
      06/09/2019  56   0  33   0
      06/10/2019  54  66  47  23
      06/11/2019   0   0  43  19
      06/12/2019  21  38   0   0
      

      【讨论】:

        【解决方案3】:

        这是因为您没有将它们保存到 df。此外,还有一个简洁的 numpy 函数 np.where(),参见 https://numpy.org/doc/1.20/reference/generated/numpy.where.html

        for i in range(0,len(df)):
          ul=upper_df.iloc[i]
          ll=lower_df.iloc[i]
          df.loc[i] = np.where(np.logical_or(df.loc[i] <= ll, df.loc[i] >= ul), 0, df.loc[i])
        

        【讨论】:

          猜你喜欢
          • 2017-05-18
          • 1970-01-01
          • 2018-03-31
          • 2010-11-13
          • 2011-10-16
          • 1970-01-01
          • 1970-01-01
          • 2017-07-28
          • 1970-01-01
          相关资源
          最近更新 更多