我在这里对熊猫还很陌生,在这个问题上我被困了好几个星期,所以作为最后的选择,我来到了这个论坛。
下面是我的数据框
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轴具有date,为此,我需要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,可能需要很多天。
任何人都可以引导我实现这一目标,也请不要误解我是直接在请求帮助/代码,即使向我指出正确的概念也可以。我还不知道如何进一步进行。
我们非常感谢您的帮助。 TIA!
答案 0 :(得分:1)
首先,由于S2Rate
值可以重复出现,因此必须首先标识S2Rate
的连续日期。这可以通过diff-cumsum
技巧来完成。 如果您想按所有S2Rate
分组,请忽略此步骤。
# 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
接下来,只需编写自定义标题生成函数,然后使用Named Aggregation将其放入.agg()
:
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
由于您是熊猫新手,因此通过official how-to也会很有帮助。