1 pd.mask
逻辑判断只能用&|而不能用and,or
df = obj.df_投料[['数量', '入库重量']].reset_index(drop=True)
df['领料为零'] = df.数量.mask(
df.数量.isna() | (df.数量.round(0) == 0),
df.入库重量
)
df1 = df.copy()
2 np.where
逻辑判断只能用&|而不能用and,or
df = obj.df_投料[['数量', '入库重量']].reset_index(drop=True)
df['领料为零'] = np.where(
df.数量.isna() | (df.数量.round(0) == 0),
df.入库重量,
df.数量
)
df2 = df.copy()
3 pd.apply
逻辑判断推荐用and,or
遍历每行的某列的值,是否为缺失值 np.isnan
用row替代df
df = obj.df_投料[['数量', '入库重量']].reset_index(drop=True)
df['领料为零'] = df.apply(
func=lambda row: row.入库重量
if np.isnan(row.数量) or (row.数量.round(0) == 0)
else row.数量,
axis=1
)
df3 = df.copy()
结果
df1.equals(df2), df1.equals(df3) # (True, True)
其他结论
往往由于先截取一个表的部分行列 再赋值 就会警告
避免警告 reset_index
参考
https://blog.51cto.com/u_16055028/7108454
https://blog.51cto.com/u_16055028/6229971
https://blog.51cto.com/u_16055028/7097630
有时候判断结果是None, 需改为逻辑判断!=False