Python 3.x 如何在聚合后有条件地对不同列的值求和?

Python 3.x 如何在聚合后有条件地对不同列的值求和?,python-3.x,pandas,aggregate-functions,pandas-groupby,Python 3.x,Pandas,Aggregate Functions,Pandas Groupby,我从以下数据帧开始: ID PRODUCT_ID NAME STOCK SELL_COUNT DELIVERED_BY PRICE_A PRICE_B 1 P1 PRODUCT_P1 12 15 UPS 32,00 40,00 2 P2 PRODUCT_P2 4 3 DHL 8,00 NaN 3 P3 PRODU

我从以下数据帧开始:

ID PRODUCT_ID        NAME  STOCK  SELL_COUNT DELIVERED_BY PRICE_A PRICE_B
1         P1  PRODUCT_P1     12          15          UPS   32,00   40,00
2         P2  PRODUCT_P2      4           3          DHL    8,00     NaN
3         P3  PRODUCT_P3    120          22          DHL     NaN  144,00
4         P1  PRODUCT_P1    423          18          UPS   98,00     NaN
5         P2  PRODUCT_P2      0           5          GLS   12,00   18,00
6         P3  PRODUCT_P3     53          10          DHL   84,00     NaN
7         P4  PRODUCT_P4     22           0          UPS    2,00     NaN
8         P1  PRODUCT_P1     94          56          GLS     NaN   49,00
9         P1  PRODUCT_P1      9          24          GLS     NaN    1,00
我试图实现的是——在按产品ID聚合之后,根据它们是否有值来求和价格A或价格B(如果两者都设置了,则优先考虑价格A)

基于@WeNYoBen的帮助,我现在知道了如何根据不同的列有条件地应用聚合函数:

def custom_aggregate(grouped):

    data = {
        'STOCK': grouped.loc[grouped['DELIVERED_BY'] == 'UPS', 'STOCK'].min(),
        'TOTAL_SELL_COUNT': grouped.loc[grouped['ID'] > 6, 'SELL_COUNT'].sum(min_count=1),
        'COND_SELL_COUNT': grouped.loc[grouped['SELL_COUNT'] > 10, 'SELL_COUNT'].sum(min_count=1)
        # THIS IS WHERE THINGS GET FOGGY...
        # I somehow need to add a second condition here, that says 
        # if PRICE_B is set - use the PRICE_B value for the sum()
        'COND_PRICE': grouped.loc[grouped['PRICE_A'].notna(), 'PRICE_A'].sum()
    }

    d_series = pd.Series(data)
    return d_series

result = df_products.groupby('PRODUCT_ID').apply(custom_aggregate)
我真的不知道使用.loc函数是否可以做到这一点。 解决此问题的一种方法是在调用已包含正确价格值的.groupby之前创建一个附加列。 但我认为可能有一种更灵活的方法来做这件事。 我很乐意为“COND_PRICE”值计算应用一个自定义函数,该值在将结果传递给sum()之前执行。在SQL中,我可以嵌套x级CASE-WHEN-END语句来实现这种逻辑。只是好奇如何在熊猫身上实现这种灵活性


非常感谢。

这是我们需要的解决方案
fillna

def custom_aggregate(grouped):

    data = {
        'STOCK': grouped.loc[grouped['DELIVERED_BY'] == 'UPS', 'STOCK'].min(),
        'TOTAL_SELL_COUNT': grouped.loc[grouped['ID'] > 6, 'SELL_COUNT'].sum(min_count=1),
        'COND_SELL_COUNT': grouped.loc[grouped['SELL_COUNT'] > 10, 'SELL_COUNT'].sum(min_count=1),
        # Fillna if A have the value A return , if not check with B , both nan will keep the value as nan
        'COND_PRICE': grouped['PRICE_A'].fillna(grouped['PRICE_B']).sum()
    }

    d_series = pd.Series(data)
    return d_series

我不太明白。根据您的输入,您的预期输出是什么?非常感谢您(再次)帮助我。这完全可以完成请求的工作。但是你能不能帮我一个忙,告诉我是否可以对sum()之前的部分应用一个函数?您基本上更新了分组['PRICE_A']中缺少的值。我要寻找的是一个函数,它将
分组
,并对每个分组行应用不同的嵌套条件和检查,以便“构建”sum()的动态值。@user2549803您可以使用np.where进行检查