1

我正在使用具有以下结构的 Pandas DataFrame:

import pandas as pd
​
df = pd.DataFrame({'brand' : ['A', 'A', 'B', 'B', 'C', 'C'], 
                   'target' : [0, 1, 0, 1, 0, 1], 
                   'freq' : [5600, 220, 5700, 90, 5000, 100]})
​
print(df)
  brand  target  freq
0     A       0  5600
1     A       1   220
2     B       0  5700
3     B       1    90
4     C       0  5000
5     C       1   100

对于每个品牌,我想计算正面目标的比率,例如对于品牌 A,正面目标的百分比是 220/(220+5600) = 0.0378。

我生成的 DataFrame 应如下所示:

  brand  target  freq   ratio
0     A       0  5600  0.0378
1     A       1   220  0.0378
2     B       0  5700  0.0156
3     B       1    90  0.0156
4     C       0  5000  0.0196
5     C       1   100  0.0196

我知道我应该按品牌对我的 DataFrame 进行分组,然后对每个组应用一些功能(因为我想在最终结果中保留所有行,所以我认为我应该在这里使用 transform)。我测试了几件事,但没有任何成功。任何帮助表示赞赏。

4

1 回答 1

2

首先按每组最后brand一行对列进行排序,然后用 lambda 函数除以:target1GroupBy.transform

df = df.sort_values(['brand','target'])
df['ratio'] = df.groupby('brand')['freq'].transform(lambda x: x.iat[-1] / x.sum())
print (df)
  brand  target  freq     ratio
0     A       0  5600  0.037801
1     A       1   220  0.037801
2     B       0  5700  0.015544
3     B       1    90  0.015544
4     C       0  5000  0.019608
5     C       1   100  0.019608

或划分由函数GroupBy.last和创建的系列GroupBy.sum

df = df.sort_values(['brand','target'])
g = df.groupby('brand')['freq']
df['ratio'] = g.transform('last').div(g.transform('sum'))
于 2020-04-08T10:53:24.840 回答