Python 使用Pandas计算rolling.mean时,忽略给定列的前面值

Python 使用Pandas计算rolling.mean时,忽略给定列的前面值,python,pandas,moving-average,Python,Pandas,Moving Average,以下是我掌握的时间序列数据的一小部分: Date Client Value 01-Sep-2016T ABC 160000 02-Sep-2016T ABC 150000 03-Sep-2016T ABC 190000 04-Sep-2016T ABC 200000 05-Sep-2016T ABC 1400

以下是我掌握的时间序列数据的一小部分:

Date              Client        Value
01-Sep-2016T      ABC           160000
02-Sep-2016T      ABC           150000
03-Sep-2016T      ABC           190000
04-Sep-2016T      ABC           200000
05-Sep-2016T      ABC           140000
06-Sep-2016T      ABC           120000
07-Sep-2016T      ABC           185000
08-Sep-2016T      ABC           119000
01-Sep-2016T      DEF           200
02-Sep-2016T      DEF           100
03-Sep-2016T      DEF           150
04-Sep-2016T      DEF           10
05-Sep-2016T      DEF           5
06-Sep-2016T      DEF           160
07-Sep-2016T      DEF           150
08-Sep-2016T      DEF           3
我创建了一个数据框,如下所示:

dataFrame = pd.read_csv('test_data_02.csv')
dataFrame['Value_MovingAverage'] = dataFrame['Value'].rolling(window=3, min_periods=1, center=False).mean()
然后,我尝试添加
列的移动平均值,如下所示:

dataFrame = pd.read_csv('test_data_02.csv')
dataFrame['Value_MovingAverage'] = dataFrame['Value'].rolling(window=3, min_periods=1, center=False).mean()
然后,当我调用
dataFrame.head(20)
查看结果
ValueMovingAverage
列时,我看到:

    Date      Client    Value     Value_MovingAverage
0   01-Sep    ABC       160000    160000.000000
1   02-Sep    ABC       150000    155000.000000
2   03-Sep    ABC       190000    166666.666667
3   04-Sep    ABC       200000    180000.000000
4   05-Sep    ABC       140000    176666.666667
5   06-Sep    ABC       120000    153333.333333
6   07-Sep    ABC       185000    148333.333333
7   08-Sep    ABC       119000    141333.333333
8   01-Sep    DEF       200       **101400.000000**
9   02-Sep    DEF       100       39766.666667
10  03-Sep    DEF       150       150.000000
11  04-Sep    DEF       10        86.666667
12  05-Sep    DEF       5         55.000000
13  06-Sep    DEF       160       58.333333
14  07-Sep    DEF       150       105.000000
15  08-Sep    DEF       3         104.333333
如我们所见,“DEF”客户端的
值\u MovingAverage
受前两个“ABC”客户端的非常高的值的影响。例如,指数#8显示“DEF”的3天移动平均值为101400.000000,因为它使用以下值:

185000 119,000 二百

平均-->101400

我试图让索引#8的值_MovingAverage不显示任何内容(因为客户机“ABC”没有前面的值),而索引#14的值_MovingAverage为58.33333,因为它引用了以下内容:

一百六十 10 5. 平均-->58.33333

我的问题是:

1) 我如何告诉Pandas在计算“DEF”客户机的移动平均值时忽略“ABC”的值(以及整个数据帧中所有其他“客户机”值的移动平均值)?请注意,我有数百个“客户机”值,因此创建不同的帧(每个“客户机”一个),然后应用滚动平均值实际上不是一个选项

2) 如何将移动平均值偏移一行,以便给定行数的平均值不考虑本身


提前谢谢

我为您提供了一个解决方案,它不会直接回答您提出的特定问题,但可能会解决您实际遇到的问题;)

也就是说:熊猫的
groupby
特性

显然,您的datadrame不仅仅是一个简单的时间序列。相反,它是一组时间序列,根据“ABC”、“DEF”等的不同值连接在一起


它看起来像是你知道如何使用熊猫的东西(例如,
滚动
),所以我把它留给你去弄清楚如何使用
groupby
,但是如果你不能让它工作,请随时回答更多问题:)

更新:

In [41]: df['new'] = (df.groupby('Client', as_index=False)
   ....:                .rolling(3, min_periods=1, center=False)
   ....:                .Value.mean()
   ....:                .reset_index(drop=True))

In [42]: df
Out[42]:
            Date Client   Value            new
0   01-Sep-2016T    ABC  160000  160000.000000
1   02-Sep-2016T    ABC  150000  155000.000000
2   03-Sep-2016T    ABC  190000  166666.666667
3   04-Sep-2016T    ABC  200000  180000.000000
4   05-Sep-2016T    ABC  140000  176666.666667
5   06-Sep-2016T    ABC  120000  153333.333333
6   07-Sep-2016T    ABC  185000  148333.333333
7   08-Sep-2016T    ABC  119000  141333.333333
8   01-Sep-2016T    DEF     200     200.000000
9   02-Sep-2016T    DEF     100     150.000000
10  03-Sep-2016T    DEF     150     150.000000
11  04-Sep-2016T    DEF      10      86.666667
12  05-Sep-2016T    DEF       5      55.000000
13  06-Sep-2016T    DEF     160      58.333333
14  07-Sep-2016T    DEF     150     105.000000
15  08-Sep-2016T    DEF       3     104.333333
In [28]: df.groupby('Client').rolling(3, min_periods=1, center=False).mean()
Out[28]:
                   Date Client          Value
Client
ABC    0   01-Sep-2016T    ABC  160000.000000
       1   02-Sep-2016T    ABC  155000.000000
       2   03-Sep-2016T    ABC  166666.666667
       3   04-Sep-2016T    ABC  180000.000000
       4   05-Sep-2016T    ABC  176666.666667
       5   06-Sep-2016T    ABC  153333.333333
       6   07-Sep-2016T    ABC  148333.333333
       7   08-Sep-2016T    ABC  141333.333333
DEF    8   01-Sep-2016T    DEF     200.000000
       9   02-Sep-2016T    DEF     150.000000
       10  03-Sep-2016T    DEF     150.000000
       11  04-Sep-2016T    DEF      86.666667
       12  05-Sep-2016T    DEF      55.000000
       13  06-Sep-2016T    DEF      58.333333
       14  07-Sep-2016T    DEF     105.000000
       15  08-Sep-2016T    DEF     104.333333
旧答案:

In [41]: df['new'] = (df.groupby('Client', as_index=False)
   ....:                .rolling(3, min_periods=1, center=False)
   ....:                .Value.mean()
   ....:                .reset_index(drop=True))

In [42]: df
Out[42]:
            Date Client   Value            new
0   01-Sep-2016T    ABC  160000  160000.000000
1   02-Sep-2016T    ABC  150000  155000.000000
2   03-Sep-2016T    ABC  190000  166666.666667
3   04-Sep-2016T    ABC  200000  180000.000000
4   05-Sep-2016T    ABC  140000  176666.666667
5   06-Sep-2016T    ABC  120000  153333.333333
6   07-Sep-2016T    ABC  185000  148333.333333
7   08-Sep-2016T    ABC  119000  141333.333333
8   01-Sep-2016T    DEF     200     200.000000
9   02-Sep-2016T    DEF     100     150.000000
10  03-Sep-2016T    DEF     150     150.000000
11  04-Sep-2016T    DEF      10      86.666667
12  05-Sep-2016T    DEF       5      55.000000
13  06-Sep-2016T    DEF     160      58.333333
14  07-Sep-2016T    DEF     150     105.000000
15  08-Sep-2016T    DEF       3     104.333333
In [28]: df.groupby('Client').rolling(3, min_periods=1, center=False).mean()
Out[28]:
                   Date Client          Value
Client
ABC    0   01-Sep-2016T    ABC  160000.000000
       1   02-Sep-2016T    ABC  155000.000000
       2   03-Sep-2016T    ABC  166666.666667
       3   04-Sep-2016T    ABC  180000.000000
       4   05-Sep-2016T    ABC  176666.666667
       5   06-Sep-2016T    ABC  153333.333333
       6   07-Sep-2016T    ABC  148333.333333
       7   08-Sep-2016T    ABC  141333.333333
DEF    8   01-Sep-2016T    DEF     200.000000
       9   02-Sep-2016T    DEF     150.000000
       10  03-Sep-2016T    DEF     150.000000
       11  04-Sep-2016T    DEF      86.666667
       12  05-Sep-2016T    DEF      55.000000
       13  06-Sep-2016T    DEF      58.333333
       14  07-Sep-2016T    DEF     105.000000
       15  08-Sep-2016T    DEF     104.333333
或:


是的,这就是我想要的。但是,“值”列被移动平均值覆盖(我原本打算将其作为一个新列,因为我仍然需要绘制原始“值”值)。有没有办法将此解决方案应用于新列?第二种方法(
df.groupby('Client',as_index=False)。滚动(3,min_periods=1,center=False)。mean()。重置_index(drop=True)
是我的目标。但是,我如何将其作为一个单独的列(因为我还需要使用绘图中现有的“Value”列)?谢谢。@Equianity,请检查答案中的更新部分是的。谢谢。但是,我们如何“抵消”它,使它不考虑自身?是否可以以某种方式合并
.shift()
?@Equianity,您可以发布您想要的输出或打开一个新问题吗?谢谢您的帮助。我刚刚打开了一个新问题: