在熊猫数据库中切片列并平均结果

时间:2016-08-12 01:08:45

标签: python pandas

如果我有一个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。

2 个答案:

答案 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