这是我的数据框:
df={'pack':[2,2,2,2], 'a_cost':[10.5,0,11,0], 'b_cost':[0,6,0,6.5]}
它应该是这样的:
此时您会发现 a_cost 和 b_cost 列有 0,而其他列有值。我希望我的功能遵循这个逻辑......
for i in df.a_cost:
if i==0:
b_cost(column):value *(multiply) pack(column):value
replace 0 with this new multiplied value (example: 6.0*2=12)
for i in df_b.cost:
if i==0:
a_cost(column):value /(divide) pack(column):value
replace 0 with this new divided value (example: 10.5/2=5.25)
我不知道如何成功地编写这个逻辑......这是预期的输出:
代码输出:
df={'pack':[2,2,2,2], 'a_cost':[10.5,12.0,11,13.0], 'b_cost':[5.25,6,5.50,6.5]}
非常感谢您的帮助!
最佳答案
国际工业联合会
df.loc[df.a_cost.eq(0), 'a_cost'] = df.b_cost * df.pack
df.loc[df.b_cost.eq(0), 'b_cost'] = df.a_cost / df.pack
您还可以使用 mask
和 fillna
:
df['a_cost'] = df.a_cost.mask(df.a_cost.eq(0)).fillna(df.b_cost * df.pack)
df['b_cost'] = df.b_cost.mask(df.b_cost.eq(0)).fillna(df.a_cost / df.pack)
更新如评论所述,您可以在mask
中使用other
:
df['a_cost'] = df.a_cost.mask(df.a_cost.eq(0), other=df.b_cost * df.pack)
另请注意,一旦您已经在 a_cost
列中填充了 0
,则不需要第二次过滤。也就是说,我们可以这样做:
df['b_cost'] = df.a_cost / df.pack
在两种方法中的第一个命令之后。
输出:
pack a_cost b_cost
0 2 10.5 5.25
1 2 12.0 6.00
2 2 11.0 5.50
3 2 13.0 6.50
关于Python:如何通过循环将 Dataframe 中的 2 列相乘来仅替换列中的 0 个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58595575/