我使用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值进行B列的平均值,在x和x + c之间,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)
但我不明白如何将它应用到我的案例中。
知道如何在高效的熊猫方法中解决这个问题吗? (使用申请,地图或滚动?)
感谢。
答案 0 :(得分:0)
您需要从链接到的answer开始,将索引转换为系列,然后您可以调用它。另一个关键的事情是你必须索引构造的系列与你的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