【问题标题】:Summing up absolute difference between different rows of values in pandas总结熊猫中不同行值之间的绝对差异
【发布时间】:2021-11-09 05:40:21
【问题描述】:

我有一个 pandas 数据框,我正在存储一些值,我试图量化这些值跨轴的对称性。 即,用 'x' == 0

对轴上测量值的绝对差求和
       x        y
0    -50    -6.24
...
49    -1    -5.05
50     0        0
51     1    -3.95
...
100   50    -5.66

所以我要计算:

|-6.24 - -5.66| + ... + |-5.05 - -3.95|

即轴的相对两侧每个'y'之间的绝对差之和。

我可以通过放入一些 for 循环(非常慢)或一些 janky 数据透视表的东西来做到这一点,但我想知道在 pandas 中是否有更干净/标准的方法来做到这一点?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:
    y = df["y"].values
    rev_y = y[::-1]
    
    np.abs(y-rev_y)
    

    或者你可以使用np.flip 方法

    np.abs(y - np.flip(y)
    

    可以参考Most efficient way to reverse numpy array

    【讨论】:

      【解决方案2】:

      试试loc:

      >>> np.abs(df.loc[::-1, 'y'].to_numpy() - df['y'].to_numpy())
      array([ 0.58,  1.1 ,  0.  ,  1.1 ,  0.58])
      >>> 
      

      或者要保留Series 类型,请使用reset_index

      >>> (df.loc[::-1, 'y'].reset_index(drop=True) - df['y'].reset_index(drop=True)).abs()
      0    0.58
      1    1.10
      2    0.00
      3    1.10
      4    0.58
      Name: y, dtype: float64
      >>> 
      

      【讨论】:

        【解决方案3】:

        这是使用 diff()abs() 方法解决此类问题的另一种方法:

         >>> # Suppose we have the following data:
         >>> import numpy as np
         >>> import pandas as pd
         >>> np.random.seed(1234) # make the following line reproducible
         >>> N = 100
         >>> # A random data for x and y column
         >>> x = np.random.randn(N)
         >>> y = np.random.randn(N)
         >>> # Let construct a dataframe
         >>> df = pd.DataFrame({"x": x, "y": z})
         >>> # We can apply the diff method to the y-column
         >>> dy = df["y"].diff()
        

        打印后,我们得到:

         >>> dy
         0          NaN
         1     0.275328
         2    -0.062942
         3    -0.218296
         4     0.198992
                 ...
         95   -1.535901
         96    0.270413
         97    1.050294
         98   -0.600781
         99   -1.339916
         Name: y, Length: 100, dtype: float64
        

        绝对值可以如下计算:

         >>> dy_absval = dy.abd()
         >>> dy_absval
         0          NaN
         1     0.275328
         2     0.062942
         3     0.218296
         4     0.198992
                 ...
         95    1.535901
         96    0.270413
         97    1.050294
         98    0.600781
         99    1.339916
         Name: y, Length: 100, dtype: float64
        

        请注意,我们可以链接 diff()abs() 以获得 dy_absval,方法是编写 dy_absval = df["y"].diff().abs()

        如果你想处理最终结果中出现的 NaN,你可以dop它用适当的值填充它的位置(比如:0.0 )。这意味着,写作:

         >>> dy_absval = df["y"].diff().abs().dropna()
         >>> # or
         >>> dy_absval = df["y"].diff().abs().fillna(0.0)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-01-24
          • 1970-01-01
          • 2016-11-08
          • 1970-01-01
          • 2015-04-06
          • 2018-05-15
          • 1970-01-01
          相关资源
          最近更新 更多