在熊猫数据框中提前滚动平均值(条件适用)

时间:2018-01-03 05:01:11

标签: python pandas

我有一个数据框,其中包含一个值和其他字符串,如下所示:

    Date        St  value   expected result
31/03/2015 0:03 Y   -108    -108
31/03/2015 0:08 Y   -108    -108
31/03/2015 0:13 Y   -108    -108
31/03/2015 0:18 Y   -108    -108
31/03/2015 0:23 Y   -108    -108
31/03/2015 0:28 N   -110    -108
31/03/2015 0:33 N   -111    -108
31/03/2015 0:38 Y   -123    -127
31/03/2015 0:43 Y   -129    -127
31/03/2015 0:48 Y   -129    -127
31/03/2015 0:53 Y   -129    -127
31/03/2015 0:58 N   -127    -127
31/03/2015 1:03 Y   -125    -125
31/03/2015 1:08 Y   -124    -125
31/03/2015 1:13 Y   -124    -125
31/03/2015 1:18 Y   -124    -125
31/03/2015 1:23 Y   -128    -125
31/03/2015 1:28 Y   -126    -125
31/03/2015 1:33 Y   -126    -125
31/03/2015 1:38 Y   -126    -125
31/03/2015 1:43 Y   -125    -125
31/03/2015 1:48 Y   -124    -125
31/03/2015 1:53 Y   -124    -125
31/03/2015 1:58 Y   -124    -125
31/03/2015 2:03 N   -124    -125
31/03/2015 2:08 N   -129    -125
31/03/2015 2:13 N   -130    -125
31/03/2015 2:18 Y   -130    -139
31/03/2015 2:23 Y   -130    -139
31/03/2015 2:28 Y   -133    -139
31/03/2015 2:33 Y   -140    -139
31/03/2015 2:38 Y   -140    -139
31/03/2015 2:43 Y   -145    -139
31/03/2015 2:48 Y   -145    -139
31/03/2015 2:53 Y   -147    -139
31/03/2015 2:58 N   -151    -139
31/03/2015 3:03 Y   -151    -168
31/03/2015 3:08 Y   -155    -168
31/03/2015 3:13 Y   -162    -168
31/03/2015 3:18 Y   -172    -168
31/03/2015 3:23 Y   -172    -168
31/03/2015 3:28 Y   -170    -168
31/03/2015 3:33 Y   -170    -168
31/03/2015 3:38 y   -170    -168
31/03/2015 3:43 Y   -177    -168
31/03/2015 3:48 Y   -177    -168
31/03/2015 3:53 Y   -177    -168

为此,我想计算每个大块的平均值和状态' Y'仅举个例如,我想计算平均值从2015年3月31日0:03 - 2015年3月31日0:23,同样地还有其他平均值从31/03/2015 0:38 - 31 / 03/2015 0:53在pandas数据帧中是否有任何内置功能来处理这个问题,我尝试使用滚动均值函数和使用' Y'和' N'但它没有提供我想要的解决方案。

我试过这样:

status=my_data['St']=='Y'
mean_value=my_data.loc[status,'value'].mean()

1 个答案:

答案 0 :(得分:2)

根据您提供的数据,我就是这样做的。

首先,您需要separate your DataFrame into chunks,然后转发填写'N'状态列中的空白。

import pandas as pd
import numpy as np

# loading data
dateparse = lambda x: pd.datetime.strptime(x, '%d/%m/%Y %M:%S')
df = pd.read_csv('data.dat',delimiter='\s+', index_col=False,date_parser=dateparse, parse_dates={'datetime': ['Date', 'Time']})

# replacing labels by integers to ease comparison
replacedict = {'Y':1,'y':1,'n':0,'N':0}
df = df.replace(replacedict)
# separating in chunks 
lst = [g for _, g in df.groupby((df['St'].diff() != 0).cumsum())]
# Foward filling the blanks in the DataFrame
current_mean = None
for dff in lst:
    if (dff['St'] == 1).all():
        current_mean = dff['value'].mean()
    dff['actual_result'] = int(round(current_mean))
# building up finished DataFrame
new_df = pd.concat(lst)