【问题标题】:Pass entire contents of a dataframe to a function in Pandas将数据框的全部内容传递给 Pandas 中的函数
【发布时间】:2013-11-09 04:20:36
【问题描述】:

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

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

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

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

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

谁能指出我正确的方向?

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

【问题讨论】:

  • 为什么不直接传递 DataFrame 本身呢?它整个矩阵,你可以在上面使用mean之类的方法就好了。
  • 我试过这样做,但在某些函数上,它返回一个数组,而不是数据框。例如,我试图用线性滤波器做同样的事情,但 scipy 中的信号处理函数似乎期望(并反过来返回)数组..
  • 我添加了一个可能对您有用的答案。不确定您的评论到底是什么意思。您无法更改其他函数 return 的对象类型,但我只是说在许多情况下,即使该函数需要一个 numpy,您也可以传递 in 一个 DataFrame数组。
  • 您是否要从整个数据框中的每个项目中减去平均值?如果signal 是二维的,avg 将返回一维帧,对吗?

标签: python numpy pandas dataframe


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    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
    

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

    【讨论】:

    • 这正是他说他不想做的事情。
    • apply 也适用于整个数据帧。如果您想从数据框中的每个项目中减去 5(或平均数),您也可以通过排除轴参数来做到这一点。
    • 所以,我并不是要将函数应用于数据框中的每个项目,而是我想将数据框的全部内容传递给函数。例如,scipy 中的希尔伯特变换采用时间点 x 特征数组,并沿第一个轴计算变换。将 10,000 x 100 矩阵传递给此函数比将 100 个单独的 10,000 长度列传递给此函数要快,如果我使用“应用”会发生这种情况。我正在努力解决这个问题。
    猜你喜欢
    • 2023-04-08
    • 1970-01-01
    • 2014-09-24
    • 2018-04-28
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2015-02-17
    相关资源
    最近更新 更多