【问题标题】:Groupby and find mean of last three instancesGroupby并找到最后三个实例的平均值
【发布时间】:2021-05-27 07:13:40
【问题描述】:

如果我有如下数据框:

cat1 cat2 val
A X 1
A Y 2
B Z 3
B M 4
A X 5
A Y 6
B Z 7
B M 8
A X 9
A Y 10
B Z 11
B M 12

groupby 返回数据帧的最佳方法是什么,只为每个 (cat1, cat2) 的最后两个实例找到平均 val?

所以对于这个例子,我们想要:

cat1 cat2 mean_of_last_two
A X 3
A Y 4
B Z 5
B M 6

【问题讨论】:

  • (A, X) 的最后两个实例是 5 和 9,为什么平均值是 3 而不是 7?你能解释一下 3 是如何计算的吗?
  • 对于列出的每个 (cat1, cat2) 的最后两个实例,mean_of_last_two values 列不应该是 [7, 8, 10, 9] 吗?

标签: python pandas dataframe numpy data-analysis


【解决方案1】:

如果您需要mean for last 3 then just replace 2 by 3,下面的代码提供了最后两次出现的平均值

三个选项

第一

df.groupby(['cat1', 'cat2'], as_index=False, sort=False).apply(lambda x: x.tail(2).mean())

将 val col 输出为浮点数

    cat1    cat2    val
0   A       X       7.0
1   A       Y       8.0
2   B       Z       9.0
3   B       M       10.0

第二

grouped = df.groupby(['cat1', 'cat2'],sort=False)
grouped.nth([-1,-2]).groupby(['cat1', 'cat2'], sort=False).val.mean().reset_index()

第三

df.groupby(['cat1', 'cat2'], sort=False).tail(2).groupby(['cat1', 'cat2'], sort=False).mean().reset_index()

将 val col 输出为 int

    cat1    cat2    val
0   A       X       7
1   A       Y       8
2   B       Z       9
3   B       M       10

编辑

最后 3 个平均值

df.groupby(['cat1', 'cat2'], sort=False).tail(3).groupby(['cat1', 'cat2'], 
    sort=False).mean().reset_index().rename(columns={'val':'mean_of_last_three'})

    cat1    cat2    mean_of_last_three
0   A       X       5
1   A       Y       6
2   B       Z       7
3   B       M       8

最近 2 次的平均值

df.groupby(['cat1', 'cat2'], sort=False).tail(2).groupby(['cat1', 'cat2'], 
    sort=False).mean().reset_index().rename(columns={'val':'mean_of_last_two'})


        cat1    cat2    mean_of_last_two
0       A       X       7
1       A       Y       8
2       B       Z       9
3       B       M       10

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多