Pandas 使用groupby计算比率
我是使用python的新手 我创建了这个数据框: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
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)