python – 用pandas计算列的“能量”

我尝试计算我的pandas.DataFrame在此
formula for discrete-time signal之后的信号能量.我尝试使用
apply和applymap,也使用reduce,如下所示:
How do I columnwise reduce a pandas dataframe?.但我尝试的只是为每个元素做了操作,而不是整个列.

这不是一个信号处理特定的问题,它只是一个例子,如何对列应用“汇总”(我不知道正确的术语)功能.

我的解决方法是获取原始的numpy.array数据并进行计算.但我很确定有一种pandatic方式来做到这一点(而且是一种更加笨拙的方式).

import pandas as pd
import numpy as np

d = np.array([[2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
              [0, -1, 2, -3, 4, -5, 6, -7, 8, -9],
              [0, 1, -2, 3, -4, 5, -6, 7, -8, 9]]).transpose()
df = pd.DataFrame(d)

energies = []

# a same as d
a = df.as_matrix()
assert(np.array_equal(a, d))

for column in range(a.shape[1]):
    energies.append(sum(a[:,column] ** 2))

print(energies) # [40, 285, 285]

提前致谢!

最佳答案 您可以为数据框输出执行以下操作 –

(df**2).sum(axis=0) # Or (df**2).sum(0)

为了提高性能,我们可以使用从数据框中提取的数组 –

(df.values**2).sum(axis=0) # Or (df.values**2).sum(0)

为了进一步提升性能,有np.einsum –

a = df.values
out = np.einsum('ij,ij->j',a,a)

运行时测试 –

In [31]: df = pd.DataFrame(np.random.randint(0,9,(1000,30)))

In [32]: %timeit (df**2).sum(0)
1000 loops, best of 3: 518 µs per loop

In [33]: %timeit (df.values**2).sum(0)
10000 loops, best of 3: 40.2 µs per loop

In [34]: def einsum_based(a):
    ...:     a = df.values
    ...:     return np.einsum('ij,ij->j',a,a)
    ...: 

In [35]: %timeit einsum_based(a)
10000 loops, best of 3: 32.2 µs per loop
点赞