我有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行添加**以便于观察。
答案 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'})