如何基于一列对df进行分组并将函数应用于pandas的另一列

时间:2020-10-18 15:14:41

标签: 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         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!

1 个答案:

答案 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也会很有帮助。