python - 如何根据一列对df进行分组并将函数应用于熊猫中的另一列
问题描述
我对 pandas 很陌生,我在这个问题上已经被困了好几个星期,所以作为最后的手段,我来到了这个论坛。
下面是我的数据框
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,次要 Y 轴将具有销售平均值。但我希望我的 x 轴有日期,为此我需要我的 df 喜欢这样(下)
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 分钟日期是 2019-05-18,最大日期是 2019-05-19,因此它需要为需要分组的 S2rate 绘制最小和最大日期,因为可能会出现以下情况相同的 S2rate,可以有很多天。
任何人都可以指导我实现这一点,也请不要误以为我是在直接寻求帮助/代码,即使指向正确的概念也可以。我有点不知道如何进一步进行。
任何帮助深表感谢。蒂亚!
解决方案
首先,由于S2Rate
值可以重复出现,因此必须首先确定a 的连续日期。S2Rate
这可以通过一个diff-cumsum
技巧来完成。如果您想按所有S2Rate
s分组,请忽略此步骤。
# 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
接下来,只需编写您的自定义标题生成函数并将其放入.agg()
使用Named Aggregation:
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
由于您是 pandas 的新手,因此阅读官方操作指南也会有所帮助。
推荐阅读
- python - TypeError: eval() arg 1 必须是字符串、字节或代码对象
- python - 需要基于某些过滤器在嵌套的 for 循环中创建多个数据框
- c# - 图像在运行时不显示在 ListBox 中
- typescript - 在 Pick 映射类型的定义中混淆 extends 关键字
- android - 在远程 VPS 上运行 Appium 和 Android 模拟器
- javascript - 如何在 JavaScript 中使用带有过滤器和映射方法的数组推送
- postgresql - 使用 Postgres 在 HugSQL 或 YesQL 中转换多个值
- knitr - 为什么我的 R 笔记本会生成一个空白的 html 文档
- python - 支持 python 的 struct.pack_into 中的新格式字符
- python - 加载保存的文件时,带有 dill.dill 消息的烧瓶错误