Python 如何基于一列对df进行分组,并将函数应用于表中的另一列
我对这里的熊猫很陌生,我已经被困在这个问题上好几个星期了,所以作为最后的选择,我来到了这个论坛 下面是我的数据框架Python 如何基于一列对df进行分组,并将函数应用于表中的另一列,python,pandas,Python,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 18
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轴将具有sale average。但我希望我的x轴有日期,我需要我的df像这样(如下)
也就是说,对于S2rate,15分钟日期为2019-05-18,最大日期为2019-05-19,因此需要对需要分组的S2rate的最小和最大日期进行pic,因为对于相同的S2rate,可能会有很多天的情况
任何人都可以指导我做到这一点,也请不要误以为我是在直接寻求帮助/代码,甚至向我指出正确的概念也可以。我有点不知道如何继续下去
非常感谢您的帮助。蒂亚 首先,由于
S2Rate
值可能重复出现,因此必须首先确定S2Rate
的连续日期。这可以通过diff-cumsum
技巧实现。如果要按所有S2Rate
s分组,请忽略此步骤
接下来,只需编写自定义标题生成函数,并使用以下命令将其放入.agg()
:
因为您是熊猫队的新手,所以浏览一下该队也会很有帮助。S2Rate是否可以重复以前的值?例如,2019-05-22和2019-05-23的S2Rate=15.00。@BillHuang是的,S2Rate可以重复,S2Rate只不过是不同日期的商品价格,例如,对于日期2020年10月1日、2020年10月2日、2020年10月3日……2020年10月10日,S2Rate可以为5。所以我需要为这个日期选择最小和最大日期。我的意思是,可能会有多个小组?比如,10月1日到10月10日是一组,但另一组在11月1日到11月10日复发。这是可能的吗?是的,这是可能的。在这种情况下,差分累积法必须完成。我已经大大简化了答案中的语法。请看一看。非常感谢黄先生!我真的很感谢你的帮助。
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
# 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