在三列熊猫上应用 RMS 公式

Posted

技术标签:

【中文标题】在三列熊猫上应用 RMS 公式【英文标题】:Applying RMS formula over three columns pandas 【发布时间】:2018-12-04 03:34:03 【问题描述】:

我正在尝试为 3 维的加速度计数据应用 RMS 函数。另外,我在开头有一个时间戳列,我以天数为单位。所以数据框如下:

       0        1       2      3
0   1.963   -12.0   -71.0   -2.0
1   1.963   -11.0   -71.0   -3.0
2   1.963   -14.0   -67.0   -6.0
3   1.963   -16.0   -63.0   -7.0
4   1.963   -18.0   -60.0   -8.0

'0'列是Days,其他列都是accelero-meter的3轴数据。现在我正在使用这种方法来计算新列的 RMS 值并删除现有的 3 轴数据:

def rms_detrend(x):
    return np.sqrt(np.mean(x[1]**2 + x[2]**2 + x[3]**2))

accdf =pd.read_csv(ACC_files[1],header=None)
accdf['ACC_RMS'] = accdf.apply(rms_detrend,axis=1)
accdf = accdf.drop([1,2,3],axis=1)
accdf.columns = accdf['Days','ACC_RMS']

但是,我有 70 个这样的加速度计数据文件,每个文件大约有 4000 多行。那么有没有更好更快(pythonic)的方法来做到这一点?谢谢。 上面的代码我只为一个文件做的,而且速度很慢。

【问题讨论】:

对于初学者来说,这里不需要调用apply,你可以直接调用accdf['ACC_RMS'] = np.mean(accdf [1] **2 + accdf [2] ** 2 + accdf [3] **2) 【参考方案1】:

用途:

accdf['ACC_RMS'] = np.sqrt(accdf.pop(1)**2 + accdf.pop(2)**2 + accdf.pop(3)**2)
print (accdf)
       0    ACC_RMS
0  1.963  72.034714
1  1.963  71.909666
2  1.963  68.709534
3  1.963  65.375837
4  1.963  63.150614

提高性能的 Numpy 解决方案:

#[50000 rows x 4 columns]
accdf = pd.concat([accdf] * 10000, ignore_index=True)

In [27]: %timeit (accdf.iloc[:,1:]**2).sum(1).pow(1/2)
1.97 ms ± 89.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [28]: %timeit np.sqrt(np.sum(accdf.to_numpy()[:,1:]**2, axis=1))
202 µs ± 1.25 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

不幸的是,我的解决方案返回错误以进行测试,但我猜它像仅 numpy 的解决方案一样慢。

【讨论】:

比apply方法快吗? @lamo_738 - 是的,它更快。 感谢它的超快!但现在@Wen 答案下方的正确答案是不同的! 鉴于应用选项较慢,如何将其应用于所有列而不损失性能? @ArturoRodriguez - 我的解决方案已编辑。【参考方案2】:

来自pandas的方法

(df.iloc[:,1:]**2).sum(1).pow(1/2)
Out[26]: 
0    72.034714
1    71.909666
2    68.709534
3    65.375837
4    63.150614
dtype: float64

【讨论】:

嘿文,显然@jezrael ans 在 0.21 秒时比您在 0.31 秒时的实现更快。但是我会记住这一点!感谢您的快速帮助 @lamo_738 yw :-) 快乐编码

以上是关于在三列熊猫上应用 RMS 公式的主要内容,如果未能解决你的问题,请参考以下文章

编写 SQL 查询,选择除同时在三列中具有指定值的行之外的所有行

ORACLE SQL 我需要在三列中输出 generation_name ,日期,总计

如何将三列合并为两列,一列是分类的,另一列是数字的? (蟒蛇熊猫)

如何在excel中用公式法从(学校 年级 班级) 三列数据中提取不重复的唯一的值?

如何将excel中的三列数值转换成一列日期

根据三列的值有条件地和交互地计算列