【问题标题】:Norm along row in pandas大熊猫中的沿行规范
【发布时间】:2013-08-30 02:43:14
【问题描述】:

我有一个 pandas 数据框,其中 N 列表示向量的坐标(例如 X、Y、Z,但可能超过 3D)。

我想使用任意组合列的函数沿行聚合数据框,例如标准:(X^2 + Y^2 + Y^2)

我想做一些类似于 hereherehere 所做的事情,但我想保持它足够通用,以便列数可以改变并且它的行为类似于

DataFrame.mean(axis = 1)

DataFrame.sum(axis = 1)

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我找到了比@elyase 建议的更快的解决方案:

    np.sqrt(np.square(df).sum(axis=1))
    

    【讨论】:

    • 还有 np.linalg.norm,但由于某种原因,您上面提供的“手动版本”更快
    • 至少在我的情况下,这可以通过执行 df.values 来加速
    • @Wizard “手动版”为什么比np.linalg.norm()快的原因我在this SO post已经讨论过了。请注意,如果涉及视图或df 有很多列,则np.linalg.norm() 最终获胜。
    【解决方案2】:

    Numpy 提供规范...使用:

    np.linalg.norm(df[['X','Y','Z']].values,axis=1)
    

    【讨论】:

      【解决方案3】:

      一行,使用你想要的任何函数(包括 lambda 函数),例如

      df.apply(np.linalg.norm, axis=1)

      df.apply(lambda x: (x**2).sum()**.5, axis=1)

      【讨论】:

        【解决方案4】:

        按名称过滤列

        cols = ['X','Y','Z']
        df[cols].mean(axis=1)
        df[cols].sum(axis=1)
        df[cols].apply(lambda values: sum([v**2 for v in values]), axis=1)
        

        【讨论】:

          【解决方案5】:

          您正在寻找apply。您的示例如下所示:

          >> df = pd.DataFrame([[1, 1, 0], [1, 0, 0]], columns=['X', 'Y', 'Z'])
               X   Y   Z
          0    1   1   0
          1    1   0   0
          
          >>> df.apply(lambda x: np.sqrt(x.dot(x)), axis=1)
          0    1.414214
          1    1.000000
          dtype: float64
          

          这适用于任意数量的维度。

          【讨论】:

          • 谢谢!我偶然发现了一个更快的解决方案:np.sqrt(np.square(df).sum(axis=1))
          • apply相比,总是更喜欢按列的函数——对于常见的操作,前者比手写应用快几个数量级。
          猜你喜欢
          • 2022-01-20
          • 2018-10-06
          • 2020-10-21
          • 2014-12-12
          • 2021-07-21
          • 2020-03-05
          • 2017-05-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多