首页 > 解决方案 > 使用 df.agg 在我的数据框上运行函数

问题描述

我有以下数据框:

tips.head()

输出:

total_bill  tip smoker  day time    size    tip_pct
0   16.99   1.01    No  Sun Dinner  2   0.059447
1   10.34   1.66    No  Sun Dinner  3   0.160542
2   21.01   3.50    No  Sun Dinner  3   0.166587
3   23.68   3.31    No  Sun Dinner  2   0.139780
4   24.59   3.61    No  Sun Dinner  4   0.146808

创建以下函数以根据列“tip_pct”对 df 进行排序并输出前 3 或 6 行。

def top(df, n=3, column='tip_pct'):
    return df.sort_values(by=column)[-n:]

top(tips, n=6)

输出:

total_bill  tip smoker  day time    size    tip_pct
0   16.99   1.01    No  Sun Dinner  2   0.059447
1   10.34   1.66    No  Sun Dinner  3   0.160542
2   21.01   3.50    No  Sun Dinner  3   0.166587
3   23.68   3.31    No  Sun Dinner  2   0.139780
4   24.59   3.61    No  Sun Dinner  4   0.146808

接下来我想要一个与上面相同的输出,但有一个区别:groupby "smoker"。

tips.groupby('smoker').apply(top)

输出为截图:

在此处输入图像描述

输出为文本文件:

total_bill  tip smoker  day time    size    tip_pct
smoker                              
No  51  10.29   2.60    No  Sun Dinner  2   0.252672
149 7.51    2.00    No  Thur    Lunch   2   0.266312
232 11.61   3.39    No  Sat Dinner  2   0.291990
Yes 67  3.07    1.00    Yes Sat Dinner  1   0.325733
178 9.60    4.00    Yes Sun Dinner  2   0.416667
172 7.25    5.15    Yes Sun Dinner  2   0.710345

现在我想做与上面相同的操作,但使用agg

tips.groupby('smoker').agg(top)

接下来我收到以下错误消息,我无法理解:

ValueError: Shape of passed values is (7, 2), indices imply (6, 2)

在此处输入图像描述

我不明白为什么它不能与agg. 我做错了什么?先感谢您。

标签: pythonpandaspandas-groupby

解决方案


原因是因为GroupBy.agg返回聚合值,也分别处理每一列,所以这里不能使用,因为处理组的所有列。


推荐阅读