如何平均每5行特定列并从Pandas的另一列中选择最后一个数据

时间:2018-08-06 09:05:51

标签: python python-2.7 pandas dataframe

我有pandas df,说100行4列。我想每5行计算特定列(“值”)中的平均值,然后选择另一列(“日期”)的最后一个数据(第五个)以保留在新数据框中。

我的数据框如下:

>>df
       DateTime     Product     Location       Value
0    12-07-2018           A           S1       1.313
1    12-07-2018           B           S1       3.089
2    12-07-2018           C           S1       1.890
3    12-07-2018           D           S1       3.136
4**  12-07-2018           E           S1       3.258
5    13-07-2018           F           S1       3.113
6    13-07-2018           G           S1       2.651
7    13-07-2018           H           S1       2.135
8    13-07-2018           I           S1       1.555
9**  14-07-2018           J           S1       2.009
10   14-07-2018           K           S1       1.757
11   14-07-2018           L           S1       1.808
12   14-07-2018           M           S1       1.511
13   15-07-2018           N           S1       2.265
14** 15-07-2018           O           S1       2.356
15   15-07-2018           P           S1       2.950
16   15-07-2018           Q           S1       3.300

现在我可以通过以下代码平均每5行:

> new_df = df.groupby(df.index // 5).agg({'DateTime':'last', 'Value':'mean'})

此代码结果:

>> new_df
     DateTime        Value
0  12-07-2018       2.5372
1  14-07-2018       2.2926
2  15-07-2018       1.9394
3  15-07-2018       3.1250

但最后2行是相同的平均值。 (2.950 + 3.300)/ 2 = 3.1250。如果它具有1,2,3,4行,则将平均行数。

我只想平均5行。如果没有5行,则不要求平均值并发送给 new_df

我该怎么做?

注意:每5行添加**以便于观察。

2 个答案:

答案 0 :(得分:1)

使用:

i = df.index // 5
#compare by last value
mask = i == i[-1]
#length of last group
no = mask.sum()

#filter only if last group less as 5
no = mask.sum()
if no < 5:
    df = df[~mask]

另一个想法:

s = pd.Series(df.index // 5)
df = df[s.groupby(s).transform('count') == 5]

new_df = df.groupby(df.index // 5).agg({'DateTime':'last', 'Value':'mean'})
print (new_df)
     DateTime   Value
0  12-07-2018  2.5372
1  14-07-2018  2.2926
2  15-07-2018  1.9394

答案 1 :(得分:1)

据我所知,您的请求等同于将df的长度截短为5,然后再进行聚合。您可以随时使用切片:

new_df = df.groupby(df[:(len(df)//5)*5].index // 5).agg({'DateTime':'last', 'Value':'mean'})