如何在自己的groupby函数中使用groupby max?

时间:2020-06-17 07:54:40

标签: python pandas pandas-groupby

我有以下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”却很难。

2 个答案:

答案 0 :(得分:1)

您可以一行完成此操作;为了更加清晰起见,我仅将其分成几行。 transform允许在整个数据帧中复制分组依据;这样我们就可以得到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

答案 1 :(得分:0)

您几乎可以使用Apply了。取决于实际数据集的大小,使用apply 可以效率低下,但是忽略这一点,您可以通过数据框过滤器上的max函数(而不是df本身)解决问题

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

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