根据列条件填充和替换 python pandas
fillna and replace based on column condition python pandas
我有一个带有 MachineType、Prod/RT 和其他几个列的 df。 MachineType 包含 TRUE 或 FALSE。需要 .fillna 和 .replace 但 MachineType 的方式不同。 (TRUE和FALSE的填充值不同)
数据框:updatedDf
我的代码执行以上计算:
updatedDf['Prod/RT']=updatedDf[updatedDf['MachineType']==True]['Prod/RT'].replace(np.inf,0.021660)
updatedDf['Prod/RT']=updatedDf[updatedDf['MachineType']==True]['Prod/RT'].fillna(0.021660)
updatedDf['Prod/RT']=updatedDf[updatedDf['MachineType']==False]['Prod/RT'].replace(np.inf,0.050261)
updatedDf['Prod/RT']=updatedDf[updatedDf['MachineType']==False]['Prod/RT'].fillna(0.050261)
但是我的代码给出了带有 Nan 值的意外输出。有什么办法可以解决这个错误吗?或者我们不能像上面那样 .fillna 和 .replace 吗?
我解决你的问题的方法是将填充和替换包装在一个函数中,并将其用作 pandas .apply()
中的参数。使用你的方法需要使用 .loc[]
.
updatedDf = pd.DataFrame({
'MachineType' : np.random.choice([True, False], 10, True),
'Prod/RT' : np.random.choice([np.nan, np.inf, random.random()], 10, True)
})
# solution 1
prod_RT_dict = {True:0.21660, False:0.050261}
def fillProd_RT(row):
if row['Prod/RT'] != np.inf and pd.notna(row['Prod/RT']):
return row['Prod/RT']
else:
return prod_RT_dict[row['MachineType']]
updatedDf['Prod/RT_2'] = updatedDf.apply(fillProd_RT, axis=1)
# solution 2
updatedDf['Prod/RT_3']=updatedDf['Prod/RT'].replace(np.inf,np.nan)
updatedDf.loc[updatedDf['MachineType']==True,'Prod/RT_3']=updatedDf\
.loc[updatedDf['MachineType']==True,'Prod/RT_3'].fillna(0.021660)
updatedDf.loc[updatedDf['MachineType']==False,'Prod/RT_3']=updatedDf\
.loc[updatedDf['MachineType']==False,'Prod/RT_3'].fillna(0.050261)
updatedDf
我有一个带有 MachineType、Prod/RT 和其他几个列的 df。 MachineType 包含 TRUE 或 FALSE。需要 .fillna 和 .replace 但 MachineType 的方式不同。 (TRUE和FALSE的填充值不同)
数据框:updatedDf
我的代码执行以上计算:
updatedDf['Prod/RT']=updatedDf[updatedDf['MachineType']==True]['Prod/RT'].replace(np.inf,0.021660)
updatedDf['Prod/RT']=updatedDf[updatedDf['MachineType']==True]['Prod/RT'].fillna(0.021660)
updatedDf['Prod/RT']=updatedDf[updatedDf['MachineType']==False]['Prod/RT'].replace(np.inf,0.050261)
updatedDf['Prod/RT']=updatedDf[updatedDf['MachineType']==False]['Prod/RT'].fillna(0.050261)
但是我的代码给出了带有 Nan 值的意外输出。有什么办法可以解决这个错误吗?或者我们不能像上面那样 .fillna 和 .replace 吗?
我解决你的问题的方法是将填充和替换包装在一个函数中,并将其用作 pandas .apply()
中的参数。使用你的方法需要使用 .loc[]
.
updatedDf = pd.DataFrame({
'MachineType' : np.random.choice([True, False], 10, True),
'Prod/RT' : np.random.choice([np.nan, np.inf, random.random()], 10, True)
})
# solution 1
prod_RT_dict = {True:0.21660, False:0.050261}
def fillProd_RT(row):
if row['Prod/RT'] != np.inf and pd.notna(row['Prod/RT']):
return row['Prod/RT']
else:
return prod_RT_dict[row['MachineType']]
updatedDf['Prod/RT_2'] = updatedDf.apply(fillProd_RT, axis=1)
# solution 2
updatedDf['Prod/RT_3']=updatedDf['Prod/RT'].replace(np.inf,np.nan)
updatedDf.loc[updatedDf['MachineType']==True,'Prod/RT_3']=updatedDf\
.loc[updatedDf['MachineType']==True,'Prod/RT_3'].fillna(0.021660)
updatedDf.loc[updatedDf['MachineType']==False,'Prod/RT_3']=updatedDf\
.loc[updatedDf['MachineType']==False,'Prod/RT_3'].fillna(0.050261)
updatedDf