我尝试计算pandas.DataFrame
之后applymap
的信号能量。我尝试使用formula for discrete-time signal和numpy.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"));
}
});
}
提前致谢!
答案 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]
)。