0

我正在尝试使用 Dataframes 而不是 numpy 数组来重新编写用于信号处理的大部分分析代码。但是,我很难弄清楚如何将数据帧的整个矩阵作为一个整体传递给函数。

例如,如果我正在计算共同的平均参考信号,我有类似的东西:

avg = signal.mean(axis=1)
CAR = signal - avg

我想做的是将一个熊猫数组传递给这个函数,并让它返回一个以 CAR 作为值的数据框。我想这样做,而不仅仅是返回一个数组,然后将其重新转换回数据帧。

听起来当您使用 df.apply() 时,它会按行或按列进行,并且不会放入整个矩阵。我可以更改 CAR 的代码来完成这项工作,但它似乎会减慢它的速度,而不是只使用 numpy 的代码一次完成所有工作。它可能不会对计算平均值产生太大影响,但我预见这可能是未来可能需要更长时间的其他功能的问题。

谁能指出我正确的方向?

编辑:澄清一下,我这样做不仅仅是为了减去平均值,这只是一个简单的例子。一个更现实的例子是沿轴 0 线性过滤数组。我想使用 scipy.signal filtfilt 函数来过滤我的数组。如果我可以只传递一个 tpts x 壮举矩阵,这很容易,但现在似乎唯一的方法是使用“应用”逐列

4

2 回答 2

3

您可以使用df.values. 但是,在许多情况下,您可以只传递 DataFrame 本身,因为它仍然允许使用普通的 numpy API(即,它具有所有正确的方法)。

于 2013-10-29T20:22:28.383 回答
-1

http://pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.apply.html 这将允许您对行(或列,或整个数据框)执行操作。

import random
signal=pd.DataFrame([[10*random.random() for _ in range(3)]for _ in range(5)])

def testm(frame, average=0):
    return frame-average  

signal.apply(testm,average=signal.mean(),axis=1)

结果:

signal  

Out[57]: 
      0         1         2
0  5.566445  7.612070  8.554966
1  0.869158  2.382429  6.197272
2  5.933192  3.564527  9.805669
3  9.676292  1.707944  2.731479
4  5.319629  3.348337  6.476631

signal.mean()

Out[59]: 
0    5.472943
1    3.723062
2    6.753203
dtype: float64

signal.apply(testm,average=signal.mean(),axis=1)

Out[58]: 
          0         1         2
0  0.093502  3.889008  1.801763
1 -4.603785 -1.340632 -0.555932
2  0.460249 -0.158534  3.052466
3  4.203349 -2.015117 -4.021724
4 -0.153314 -0.374724 -0.276572

这将取每列的平均值,然后从该列中的每个值中减去它。

于 2013-10-29T20:09:00.317 回答