【问题标题】:Pandas: Sliding average based on unevenly index valuesPandas:基于不均匀指数值的滑动平均值
【发布时间】:2014-12-01 13:49:23
【问题描述】:

我正在使用 Pandas 0.13.0,并尝试根据索引值进行滑动平均。

索引值分布不均。 索引按递增和唯一值排序。

import pandas as pd
import Quantities as pq

f = { 
    'A': [ 0.0,  0.1,  0.2,  0.5,  1.0,  1.4,  1.5] * pq.m,
    'B': [10.0, 11.0, 12.0, 15.0, 20.0, 30.0, 50.0] * pq.kPa      
}

df = pd.DataFrame(f)

df.set_index(df['A'], inplace=True)

DataFrame 给出:

in: print df

out:
      A       B
A                 
0.00  0.00 m  10.0 kPa
0.10  0.10 m  11.0 kPa
0.20  0.20 m  12.0 kPa
0.50  0.50 m  15.0 kPa
1.00  1.00 m  20.0 kPa
1.40  1.40 m  30.0 kPa
1.50  1.50 m  50.0 kPa

现在我想为索引的每个 x 值(在 x 和 x+c 之间)计算 B 列的平均值,c 是用户定义的标准。

为了这个例子,c = 0.40。

平均过程会给出:

      A       B          C
A                 
0.00  0.00 m  10.0 kPa   11.0 kPa  = (10.0 + 11.0 + 12.0) / 3
0.10  0.10 m  11.0 kPa   12.7 kPa  = (11.0 + 12.0 + 15.0) / 3
0.20  0.20 m  12.0 kPa   13.5 kPa  = (12.0 + 15.0) / 2
0.50  0.50 m  15.0 kPa   15.0 kPa  = (15.0) / 1
1.00  1.00 m  20.0 kPa   25.0 kPa  = (20.0 + 30.0) / 2
1.40  1.40 m  30.0 kPa   40.0 kPa  = (30.0 + 50.0) / 2
1.50  1.50 m  50.0 kPa   50.0 kPa  = (50.0) / 1

请注意,由于索引值的空间不均匀,有时会找不到 x+c。现在还可以,不过我肯定会添加一种方法,在 x+c 之前的值和 x+c 之后的值之间取平均值,所以我得到了更准确的平均值。

我尝试了从 Zelazny7 找到的解决方案: pandas rolling computation with window based on values instead of counts

但我不能让它适用于我的情况,在索引上进行搜索。

我还看了: Pandas Rolling Computations on Sliding Windows (Unevenly spaced)

但我不明白如何将它应用到我的案例中。

知道如何以高效的 Pandas 方法解决这个问题吗? (使用apply、map还是rolling?)

谢谢。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您需要从链接到的answer 中做的是将索引变成一个系列,这样您就可以对其调用 apply 了。这里的另一个关键是您还必须将构建的系列索引为与您的 df 索引相同的索引,因为默认情况是从头开始创建一个索引,例如 0,1,2,3...

    In [26]:
    
    def f(x, c):
        ser = df.loc[(df.index >= x) & (df.index <= x + c),'B']
        return ser.mean()
    
    df['C'] = pd.Series(data = df.index, index = df.index).apply(lambda x: f(x,c=0.4))
    df
    
    Out[26]:
           A   B          C
    A                      
    0.0  0.0  10  11.000000
    0.1  0.1  11  12.666667
    0.2  0.2  12  13.500000
    0.5  0.5  15  15.000000
    1.0  1.0  20  25.000000
    1.4  1.4  30  40.000000
    1.5  1.5  50  50.000000
    

    【讨论】:

    • 您好,非常感谢您的回答。这绝对有帮助。但是我在平均过程后松开了单元。 C 列应返回以“kPa”为单位的结果。如果我在 f 函数中打印 ser.mean() ,则附加该单元。但是在返回结果时它会丢失。
    • @Julien 我尝试使用您的数量模块,但它对我的数据没有任何作用,您可以将其添加到函数中,例如return ser.mean() * pq.kPa 或在生成列后执行此操作,例如df['C'] = df['C'] * pq.kPa
    • @Julien 问题可能是我运行的版本不同,我使用的是 pandas 0.14.1、numpy 1.9.0 和 python 3.3.2 64 位
    • 好的,感谢您的澄清。由于某些原因,Pandas 0.14.1 对我不起作用(找不到用 pip 轮安装它的方法,而且我不只使用 exe 是 IT 要求)。使用我当前的配置处理该单元的唯一方法是:unit = df['B'].values[0].units 然后df['C'] = [x*unit for x in df['C'].values]。我会将您的答案标记为已解决,因为我似乎对 Pandas 有意见。再次感谢您的帮助。
    • 关于信息,我使用的是 Pandas 0.13.0、numpy 1.8.1 和 python 2.6.6。出于 IT 原因,我必须坚持使用 python 2.6.6,但我可以调查 Pandas 0.14.1。干杯。
    猜你喜欢
    • 1970-01-01
    • 2021-11-19
    • 2023-03-10
    • 1970-01-01
    • 2014-08-22
    • 2021-06-26
    • 1970-01-01
    • 2020-04-20
    • 2018-05-08
    相关资源
    最近更新 更多