【问题标题】:How to use groupby max in own groupby function?如何在自己的 groupby 函数中使用 groupby max?
【发布时间】:2020-06-17 16:08:15
【问题描述】:

我有以下 df

d = {'CAT':['C1','C2','C1','C2'],'A': [10, 20,30,40], 'B': [3, 4,10,3]}
df1 = pd.DataFrame(data=d)

我正在尝试包含一个通过将“A”除以最高“B”获得的新列,它是类别(“CAT”)。也就是我想用10除以10、20除以4、10除以10、40除以4得到下面的df

d = {'CAT':['C1','C2','C1','C2'],'A': [10, 20,30,40], 'B': [3, 4,10,3], 'C':[1,5,3,10]}

有什么建议吗?



我发现无需在 CAT 上进行条件/分组即可轻松完成

d = {'A': [10, 20,30,40], 'B': [3, 4,10,3]}
df1 = pd.DataFrame(data=d)
df1 = df1.apply(lambda x:x.A/max(df1['B']),axis=1)

但是对于“CAT”,我很难过。

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    您可以在一行中完成此操作;为了更清楚,我只把它分成几行。 transform 允许在整个数据帧中复制 groupby;这样我们就可以得到 C 列的结果:

    grouping = df1.groupby("CAT").B.transform("max")
    df1['C'] = df1.A.div(grouping)
    df1
    
    
    
        CAT A   B   C
    0   C1  10  3   1.0
    1   C2  20  4   5.0
    2   C1  30  10  3.0
    3   C2  40  3   10.0
    

    【讨论】:

      【解决方案2】:

      您在使用 apply 的过程中大部分时间都在使用。根据实际数据集的大小,使用 apply 可能效率低下,但忽略这一点,您可以通过数据帧过滤器上的“max”函数而不是 df 本身来解决问题.

      或者,只是为了获取代码:

      df1['calculation'] = df1.apply(lambda row: row['A'] / max(df1[df1['CAT'] == row['CAT']]['B']), axis=1)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-11
        • 2017-01-26
        • 2021-06-22
        • 1970-01-01
        • 2013-03-29
        • 2021-03-04
        • 1970-01-01
        • 2014-06-29
        相关资源
        最近更新 更多