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