我有以下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上conditiongroupby
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',我有一个难题。
你可以在一行中完成;为了更清晰,我只把它分成几行。变换 允许在整个数据框架中复制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
使用apply就差不多了。根据你实际数据集的大小,使用 apply 可以 工作效率低下,但忽略这一点,你可以通过数据框的过滤器上的'max'函数来解决你的问题,而不是df本身。
或者,只是为了得到代码。
df1['calculation'] = df1.apply(lambda row: row['A'] / max(df1[df1['CAT'] == row['CAT']]['B']), axis=1)