Pandas通过计算多列对每行应用函数



我被一个简单的问题困扰了,我的问题标题可能不合适。

df = pd.DataFrame(list(zip(['a', 'a', 'b', 'b', 'c', 'c', 'c'], 
['a1', 'a2', 'b1', 'b2', 'c1', 'c2', 'c3'],
[110, 80, 100, 180, 12], 
[5, 7, 2, 6, 10])), 
columns=['name', 'ingredient', 'amount', 'con'])

我想计算(df.amount * df.con)/df.groupby('name').agg({'amount':'sum'}).reset_index().loc(df.name==i).amount)(对不起,这一行将返回错误,但我想要的是计算总浓度(在每个名称下)基于每个成分的数量和成分con。

下面是我的代码:
df['cal'] =df.amount * df.con
df = df.merge(df.groupby('name').agg({'amount':'sum'}).reset_index(),
on = ['name'], how = 'left', suffixes = (None, '_y'))
df['what_i_want'] = df['cal']/df['amount_y']
df.groupby('name').what_i_want.sum()

输出:

name
a     5.842105
b     4.571429
c    10.000000
Name: what_i_want, dtype: float64

这个计算有什么捷径吗?

谢谢。

iuc,可以使用:

out = (df
.groupby('name')
.apply(lambda g: g['amount'].mul(g['con']).sum()/g['amount'].sum())
)

输出:

name
a     5.842105
b     4.571429
c    10.000000
dtype: float64

要简化操作(特别是删除合并),可以使用groupy.transform,它将保留原始索引:

df["what_i_want_2"] = (df["amount"] * df["con"]) / (
df.groupby("name")["amount"].transform("sum")
)

最新更新