用熊猫计算列的“能量”

时间:2017-02-23 14:48:38

标签: python pandas numpy

我尝试计算pandas.DataFrame之后applymap的信号能量。我尝试使用formula for discrete-time signalnumpy.array,同时使用reduce,如下所示:apply。但我尝试的只是为每个元素做了操作,而不是整个列。

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

我的解决方法是获取原始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] 数据并进行计算。但我很确定有一种pandatic的方法可以做到这一点(而且是一种更加笨拙的方式)。

@Override
public void onMapReady(GoogleMap googleMap) {

    ... 

    mMap.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener() {
        @Override
        public void onMapLongClick(LatLng latLng) {
            googleMap.addMarker(new MarkerOptions()
                    .position(latLng)
                    .title("Your marker title")
                    .snippet("Your marker snippet"));
        }
    }); 
}

提前致谢!

3 个答案:

答案 0 :(得分:4)

您可以对数据框输出执行以下操作 -

(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

答案 1 :(得分:2)

您可以DataFrame.pow使用DataFrame.sum

print (df.pow(2).sum())
0     40
1    285
2    285
dtype: int64

print (df.pow(2).sum().values.tolist())
[40, 285, 285]

答案 2 :(得分:1)

有一个属性df.var()可返回列的方差。哪个是能量(取决于定义,您可能需要将其乘以元素数df.var()*df.shape[0])。