大熊猫中的沿行规范
Posted
技术标签:
【中文标题】大熊猫中的沿行规范【英文标题】:Norm along row in pandas 【发布时间】:2013-08-30 02:43:14 【问题描述】:我有一个 pandas 数据框,其中 N 列表示向量的坐标(例如 X、Y、Z,但可能超过 3D)。
我想使用任意组合列的函数沿行聚合数据框,例如标准:(X^2 + Y^2 + Y^2)
。
我想做一些类似于 here 和 here 和 here 所做的事情,但我想保持它足够通用,以便列数可以改变并且它的行为类似于
DataFrame.mean(axis = 1)
或
DataFrame.sum(axis = 1)
【问题讨论】:
【参考方案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
相比,总是更喜欢按列的函数——对于常见的操作,前者比手写应用快几个数量级。以上是关于大熊猫中的沿行规范的主要内容,如果未能解决你的问题,请参考以下文章