Python:如何通过循环将 Dataframe 中的 2 列相乘来仅替换列中的 0 个值?

标签 python pandas dataframe for-loop if-statement

这是我的数据框:

df={'pack':[2,2,2,2], 'a_cost':[10.5,0,11,0], 'b_cost':[0,6,0,6.5]}

它应该是这样的:

this

此时您会发现 a_costb_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)

我不知道如何成功地编写这个逻辑......这是预期的输出:

Dataframe

代码输出:

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

您还可以使用 maskfillna:

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/

相关文章:

python - 纠正时间序列中的时钟漂移

python - 在 Pandas 中使用特定的最大计数替换和复制字符串

r - 获取 data.frame 的 colclasses 的优雅方法

python - 如何使用 NumPy ndarray 从 HDF5 数据集共享内存

python - 多态性在 Python 中是如何工作的?

python - 属性错误 : 'module' object has no attribute (when using cPickle)

python - 用 NA 替换 pandas 数据框中所有出现的值的快速方法

apache-spark - Spark SQL : How to call UDF from DataFrame operation using JAVA

r - 在向量列表中,将每个向量转换为字符串,然后转换为 R 中的数据帧

javascript - 如何使用angularJS在成功提交后刷新页面