python pandas数据帧中的明确数值积分

时间:2017-05-10 18:57:21

标签: python pandas

我有一个可变列数的pandas数据帧。我想数字地整合数据帧的每一列,以便我可以评估从第0行到第0行的定积分。' n'。我有一个可以在一维数组上运行的函数,但是在pandas数据框中有更好的方法吗?这样我就不必迭代列和单元格了吗?我在考虑使用applymap的一些方法,但我不知道如何使它工作。

这是适用于一维数组的功能:

    def findB(x,y):

        y_int = np.zeros(y.size)
        y_int_min = np.zeros(y.size)
        y_int_max = np.zeros(y.size)
        end = y.size-1

       y_int[0]=(y[1]+y[0])/2*(x[1]-x[0])

       for i in range(1,end,1):
            j=i+1
            y_int[i] = (y[j]+y[i])/2*(x[j]-x[i]) + y_int[i-1]

       return y_int

我希望将其替换为同时计算数据框的多个列的内容,如下所示:

    B_df = y_df.applymap(integrator)  

编辑:

启动数据帧dB_df:

        Sample1 1 dB    Sample1 2 dB    Sample1 3 dB    Sample1 4 dB Sample1 5 dB   Sample1 6 dB
    0   2.472389    6.524537    0.306852    -6.209527   -6.531123   -4.901795
    1   6.982619    -0.534953   -7.537024   8.301643    7.744730    7.962163
    2   -8.038405   -8.888681   6.856490    -0.052084   0.018511    -4.117407
    3   0.040788    5.622489    3.522841    -8.170495   -7.707704   -6.313693
    4   8.512173    1.896649    -8.831261   6.889746    6.960343    8.236696
    5   -6.234313   -9.908385   4.934738    1.595130    3.116842    -2.078000
    6   -1.998620   3.818398    5.444592    -7.503763   -8.727408   -8.117782
    7   7.884663    3.818398    -8.046873   6.223019    4.646397    6.667921
    8   -5.332267   -9.163214   1.993285    2.144201    4.646397    0.000627
    9   -2.783008   2.288842    5.836786    -8.013618   -7.825365   -8.470759

结束数据框B_df:

        Sample1 1 B Sample1 2 B Sample1 3 B Sample1 4 B Sample1 5 B Sample1 6 B
    0   0.000038    0.000024    -0.000029   0.000008    0.000005    0.000012
    1   0.000034    -0.000014   -0.000032   0.000041    0.000036    0.000028
    2   0.000002    -0.000027   0.000010    0.000008    0.000005    -0.000014
    3   0.000036    0.000003    -0.000011   0.000003    0.000002    -0.000006
    4   0.000045    -0.000029   -0.000027   0.000037    0.000042    0.000018
    5   0.000012    -0.000053   0.000015    0.000014    0.000020    -0.000023
    6   0.000036    -0.000023   0.000004    0.000009    0.000004    -0.000028
    7   0.000046    -0.000044   -0.000020   0.000042    0.000041    -0.000002
    8   0.000013    -0.000071   0.000011    0.000019    0.000028    -0.000036
    9   0.000000    0.000000    0.000000    0.000000    0.000000    0.000000

在上面的例子中,

    (x[j]-x[i]) = 0.000008

2 个答案:

答案 0 :(得分:0)

首先,您可以使用矢量化操作获得类似的结果。积分的每个元素只是当前和下一个y值的平均值,由x中的相应差异缩放。最终积分只是这些元素的累积总和。您可以通过执行类似

的操作来获得相同的结果
def findB(x, y):
    """
    x : pandas.Series
    y : pandas.DataFrame
    """
    mean_y = (y[:-1] + y.shift(-1)[:-1]) / 2
    delta_x = x.shift(-1)[:-1] - x[:-1]
    scaled_int = mean_y.multiply(delta_x)
    cumulative_int = scaled_int.cumsum(axis='index')
    return cumulative_int.shift(1).fillna(0)

此处DataFrame.shiftSeries.shift用于将“next”元素的索引与当前元素进行匹配。您必须使用DataFrame.multiply而不是*运算符来确保使用正确的轴('index' vs 'column')。最后,DataFrame.cumsum提供了最终的集成步骤。 DataFrame.fillna确保您在原始解决方案中拥有第一行零。使用所有本机pandas函数的优点是,您可以传入包含任意数量列的数据框,并使其同时对所有列进行操作。

答案 1 :(得分:0)

您真的要寻找积分的数值吗?也许您只需要图片?然后,使用 pyplot

`<`REFERENCE` IN ('REFERENCE_A','REFERENCE_B','REFERENCE_C')>` 

enter image description here