首页 > 解决方案 > 如何根据一列对df进行分组并将函数应用于熊猫中的另一列

问题描述

我对 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 轴有日期,为此我需要我的 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,可以有很多天。

任何人都可以指导我实现这一点,也请不要误以为我是在直接寻求帮助/代码,即使指向正确的概念也可以。我有点不知道如何进一步进行。

任何帮助深表感谢。蒂亚!

标签: pythonpandas

解决方案


首先,由于S2Rate值可以重复出现,因此必须首先确定a 的连续日期。S2Rate这可以通过一个diff-cumsum技巧来完成。如果您想按所有S2Rates分组,请忽略此步骤。

# 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

接下来,只需编写您的自定义标题生成函数并将其放入.agg()使用Named Aggregation

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

由于您是 pandas 的新手,因此阅读官方操作指南也会有所帮助。


推荐阅读