我对这里的熊猫很陌生,我在这个问题上被困了好几个星期,所以作为最后的手段,我来到了这个论坛。
下面是我的数据
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像这样(下面)
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,可能有很多天。
谁能引导我做到这一点,也请不要误会我是直接请求帮助/代码,甚至指向正确的概念就行了。我一点也不知道该怎么做。
任何帮助都是非常感谢的。蒂娅!
发布于 2020-10-18 21:51:25
首先,由于S2Rate值可以重新出现,必须首先标识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接下来,只需编写自定义的标题生成函数,并使用命名聚合将其放入命名聚合中。
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既然你是熊猫的新手,通过官方如何-到也会很有帮助。
https://stackoverflow.com/questions/64414924
复制相似问题