首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何根据一列对df进行分组,并将函数应用于熊猫中的另一列

如何根据一列对df进行分组,并将函数应用于熊猫中的另一列
EN

Stack Overflow用户
提问于 2020-10-18 15:14:41
回答 1查看 49关注 0票数 0

我对这里的熊猫很陌生,我在这个问题上被困了好几个星期,所以作为最后的手段,我来到了这个论坛。

下面是我的数据

代码语言:javascript
运行
复制
    S2Rate  S2BillDate  Sale Average    Total Sale
0   20.00   2019-05-18  20.000000         20.00
1   15.00   2019-05-18  26.250000         420.00
2   15.00   2019-05-19  36.000000         180.00
3   7.50    2019-05-19  34.500000         172.50
4   7.50    2019-05-21  32.894737         625.00

我试图绘制一个图,其中我的主y轴将有S2rate和二级Yaxis将有销售平均值。但是我希望我的x轴有一个日期,为此我需要我的df像这样(下面)

代码语言:javascript
运行
复制
    S2Rate  S2BillDate                  Sale Average    Total Sale
0   20.00   2019-05-18                  20.000000         20.00
1   15.00   2019-05-18 to 2019-05-19    31.1250000        600.00

2   7.50    2019-05-19 to 2019-05-21    33.690000         797.50

也就是说,对于S2rate 15 min日期是2019-05-18,最大日期是2019-05-19,所以它需要为需要分组的S2rate确定最小和最大日期,因为对于相同的S2rate,可能有很多天。

谁能引导我做到这一点,也请不要误会我是直接请求帮助/代码,甚至指向正确的概念就行了。我一点也不知道该怎么做。

任何帮助都是非常感谢的。蒂娅!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-18 21:51:25

首先,由于S2Rate值可以重新出现,必须首先标识S2Rate连续日期。这可以通过diff-cumsum技巧来完成。如果要按所有S2Rate__s进行分组,请忽略此步骤。

代码语言:javascript
运行
复制
# identify consecutive groups of S2Rate
df["S2RateGroup"] = (df["S2Rate"].diff() != 0).cumsum()

df
Out[268]: 
   S2Rate  S2BillDate  Sale Average  Total Sale  S2RateGroup
0    20.0  2019-05-18     20.000000        20.0            1
1    15.0  2019-05-18     26.250000       420.0            2
2    15.0  2019-05-19     36.000000       180.0            2
3     7.5  2019-05-19     34.500000       172.5            3
4     7.5  2019-05-21     32.894737       625.0            3

接下来,只需编写自定义的标题生成函数,并使用命名聚合将其放入命名聚合中。

代码语言:javascript
运行
复制
def date_agg(col):
    dmin = col.min()
    dmax = col.max()
    return f"{dmin} to {dmax}" if dmax > dmin else f"{dmin}"

df.groupby("S2RateGroup").agg(  # or .groupby("S2Rate")
    s2rate=pd.NamedAgg("S2Rate", np.min),
    date=pd.NamedAgg("S2BillDate", date_agg),
    sale_avg=pd.NamedAgg("Sale Average", np.mean),
    total_sale=pd.NamedAgg("Total Sale", np.sum)
)
# result
Out[270]: 
             s2rate                      date   sale_avg  total_sale
S2RateGroup                                                         
1              20.0                2019-05-18  20.000000        20.0
2              15.0  2019-05-18 to 2019-05-19  31.125000       600.0
3               7.5  2019-05-19 to 2019-05-21  33.697368       797.5

既然你是熊猫的新手,通过官方如何-到也会很有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64414924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档