我有一个数据框,其中包含一个值和其他字符串,如下所示:
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()
答案 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)