Pandas 使用groupby计算比率

Pandas 使用groupby计算比率,pandas,group-by,Pandas,Group By,我是使用python的新手 我创建了这个数据框: d2= {'id': ['x2', 'x2', 'x2', 'x2', 'x3', 'x3', 'x3'], 'cod': [101001, 101001, 101001, 101001, 101002, 101002, 101002], 'flag': ['IN', 'IN', 'IN','CMP', 'IN', 'OUT', 'CMP'], 'col': [100, 100, 100, 300, 100, 300, 100] } df2

我是使用python的新手 我创建了这个数据框:

d2= {'id': ['x2', 'x2', 'x2', 'x2', 'x3', 'x3', 'x3'], 'cod': [101001, 101001, 101001, 101001, 101002, 101002, 101002], 
 'flag': ['IN', 'IN', 'IN','CMP', 'IN', 'OUT', 'CMP'], 'col': [100, 100, 100, 300, 100, 300, 100]
}
df2 = pd.DataFrame(data=d2)
我想计算一个比率:(sum(IN)/sum(all)groupby id*cod。 预期输出应为

  d2= {'id': ['x2', 'x2', 'x2', 'x2', 'x3', 'x3', 'x3'], 'cod': [101001, 101001, 101001, 101001, 101002, 101002, 101002], 
 'flag': ['IN', 'IN', 'IN','CMP', 'IN', 'OUT', 'CMP'], 'col': [0.5, 0.5, 0.5, 0.5, 0.2, 0.2, 0.2]
}
df2 = pd.DataFrame(data=d2)

如果我不清楚,请告诉我。谢谢

首先将不匹配的值替换为
0
in,聚合
sum
和ast除列:

df3 = (df2.assign(new = df2['col'].where(df2['flag'].eq('IN'), 0))
          .groupby(['id','cod'])
          .transform('sum'))

df2['rat'] = df3['new'].div(df3['col'])
print (df2)
   id     cod flag  col  rat
0  x2  101001   IN  100  0.5
1  x2  101001   IN  100  0.5
2  x2  101001   IN  100  0.5
3  x2  101001  CMP  300  0.5
4  x3  101002   IN  100  0.2
5  x3  101002  OUT  300  0.2
6  x3  101002  CMP  100  0.2

您可以创建一个临时列(
new
),并将临时列与
groupby
transform
结合使用,以获得每行的比率:

(df2
 .assign(
    new = np.where(df2.flag == "IN", df2.col, 0), 
    ratio = lambda df : df.groupby(['id', 'cod'])
                          .pipe(lambda df: df['new']
                                           .transform('sum')
                                           .div(df['col'].transform('sum'))
                                   )
            )
 )

   id     cod flag  col  new  ratio
0  x2  101001   IN  100  100    0.5
1  x2  101001   IN  100  100    0.5
2  x2  101001   IN  100  100    0.5
3  x2  101001  CMP  300    0    0.5
4  x3  101002   IN  100  100    0.2
5  x3  101002  OUT  300    0    0.2
6  x3  101002  CMP  100    0    0.2
印刷品:

id cod标志列
0 x2 101001英寸0.5英寸
1 x2 101001英寸0.5英寸
2×101001英寸0.5英寸
3 x2 101001 CMP 0.5
4×101002英寸0.2
5 x3 101002输出0.2
6 x3 101002 CMP 0.2
df2["col"] = df2.groupby(["id", "cod"], as_index=False)["col"].transform(
    lambda x: x[df2.iloc[x.index]["flag"] == "IN"].sum() / x.sum(),
)
print(df2)