如果我有一个pandas数据库,例如:
timestamp label value new
etc. a 1 3.5
b 2 5
a 5 ...
b 6 ...
a 2 ...
b 4 ...
我希望新列是最后两个a和最后两个b的平均值...所以对于第一个,平均值为5和2得到3.5。它将按时间戳排序。我知道我可以使用groupby来获得所有a或所有b的平均值,但我不知道如何获得最后两个的平均值。我是python和编码的新手,所以这可能不是可能的idk。
编辑:我还应该提到这不是一个类或任何东西,这只是我自己做的事情,而且这将是一个非常大的数据集。我只是以此为例。此外,我希望每个A和每个B都有最后2个平均值的值,因此新列的维度将与其他列相同。因此对于第三行,它将是2的平均值以及数据集中的下一个a。
答案 0 :(得分:0)
编辑以反映问题中的更改,指定最后两个,而不是第一个之后的更改,并且您希望重复值具有相同的维度。
import pandas as pd
data = {'label': ['a','b','a','b','a','b'], 'value':[1,2,5,6,2,4]}
df = pd.DataFrame(data)
grouped = df.groupby('label')
results = {'label':[], 'tail_mean':[]}
for item, grp in grouped:
subset_mean = grp.tail(2).mean()[0]
results['label'].append(item)
results['tail_mean'].append(subset_mean)
res_df = pd.DataFrame(results)
df = df.merge(res_df, on='label', how='left')
输出:
>> res_df
label tail_mean
0 a 3.5
1 b 5.0
>> df
label value tail_mean
0 a 1 3.5
1 b 2 5.0
2 a 5 3.5
3 b 6 5.0
4 a 2 3.5
5 b 4 5.0
现在,只有结果的数据框,如果需要,还有一个列,并将其合并回主数据帧。其他人发布了一种更简洁的方式来获取结果数据框;可能没有理由按照我在这里展示的更长的方式去做,除非你还需要执行更多这样的操作,你可以在同一个循环内完成。
答案 1 :(得分:0)
IIUC这样做的一种方式(很多):
In [139]: df.groupby('label').tail(2).groupby('label').mean().reset_index()
Out[139]:
label value
0 a 3.5
1 b 5.0