大熊猫中的沿行规范

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相比,总是更喜欢按列的函数——对于常见的操作,前者比手写应用快几个数量级。

以上是关于大熊猫中的沿行规范的主要内容,如果未能解决你的问题,请参考以下文章

如何规范化熊猫数据框中的以下日期?

如何使用熊猫规范化来自excel文件的嵌套字典数据

Python pandas:规范化数据的最佳方法? [复制]

规范化 pandas 中的数据

Excel - 如何沿行增加公式引用

规范化熊猫数据框的列