Python 如果根据条件从其他表中缺少数据,则更新行

Python 如果根据条件从其他表中缺少数据,则更新行,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个包含4列的df,并使用Prod和RT列创建另一列(每个运行时的生产)。我用这张表作为参考表 样本参考Df: data = {'Machine': ['M1','M2','M2','M4','M4'], 'Type': ['A1', 'D1', 'D2', 'A2','A5'],'Prod': [100, 150, 180, 300,120],'RT': [43200,12000,3900,36000,4000]} df=pd.DataFrame.from_dict(data) df['P

我有一个包含4列的df,并使用Prod和RT列创建另一列(每个运行时的生产)。我用这张表作为参考表

样本参考Df:

data = {'Machine': ['M1','M2','M2','M4','M4'], 'Type': ['A1', 'D1', 'D2', 'A2','A5'],'Prod': [100, 150, 180, 300,120],'RT': [43200,12000,3900,36000,4000]}
df=pd.DataFrame.from_dict(data)
df['Prod/RT']=df['Prod']/df['RT']
df

下表是我的日常表格。我想做的是,如果“Prod/RT”列包含缺少的值请检查参考表中该特定行的机器和类型组合如果可用,则从参考表中更新其值,如果不可用,则将其更新为0.002

datanew = {'Machine': ['M1','M2','M2','M4','M44','M55'], 'Type': ['A1', 'D1', 'D2', 'A2','A5','B4'],'Prod': [200, 0, 180, 0,0,0],'RT': [43200,0,3900,0,0,0]}
df1=pd.DataFrame.from_dict(datanew)
df1['Prod/RT']=df1['Prod']/df1['RT']
df1

例如:

第二行“Prod/RT”为NaN:Machine ID:M2&Type D1>其在参考表中可用,并将空值更新为0.012500

第四行:机器ID:M4&类型A2>其在参考表中可用,并将空值更新为0.008333

第5行和第4行:参考表中未列出的机器和类型组合。因此,将其值更新为默认值(0.002)。

让我们尝试使用


让我们试试使用



以实际列为目标,在使用
0.002
运行
fillna
之前,首先填充原始数据帧中的值:

group = ['Machine', 'Type']

df1.assign(**{"Prod/RT" : lambda df1: df1.set_index(group)['Prod/RT']
                                         .fillna(df.set_index(group)['Prod/RT'])
                                         .fillna(0.002)
                                         .array})


  Machine Type  Prod     RT   Prod/RT
0      M1   A1   200  43200  0.004630
1      M2   D1     0      0  0.012500
2      M2   D2   180   3900  0.046154
3      M4   A2     0      0  0.008333
4     M44   A5     0      0  0.002000
5     M55   B4     0      0  0.002000

以实际列为目标,在使用
0.002
运行
fillna
之前,首先填充原始数据帧中的值:

group = ['Machine', 'Type']

df1.assign(**{"Prod/RT" : lambda df1: df1.set_index(group)['Prod/RT']
                                         .fillna(df.set_index(group)['Prod/RT'])
                                         .fillna(0.002)
                                         .array})


  Machine Type  Prod     RT   Prod/RT
0      M1   A1   200  43200  0.004630
1      M2   D1     0      0  0.012500
2      M2   D2   180   3900  0.046154
3      M4   A2     0      0  0.008333
4     M44   A5     0      0  0.002000
5     M55   B4     0      0  0.002000

非常感谢sushanth。如果我在df1中有各种列,但只想从df1更新Prod/RT列,该怎么办。例如,df1有另一组列speed、weight和etcThanks a lot@sushanth。如果我在df1中有各种列,但只想从df1更新Prod/RT列,该怎么办。例如,df1还有一组列speed、weight和etccan,请解释一下代码?为什么使用**?在
assign
子句中,键
Prod/RT
是不可接受的(它不是可接受的键)。工作方法是传递一本字典,然后
解包
,这正是
**
所要做的。但是为什么您说Prod/RT不是一个可接受的键呢?Assign使用只接受字符串的kwargs。Prod/RT不能识别为字符串,因此它会抛出一个错误。你能解释一下代码吗?为什么使用**?在
assign
子句中,键
Prod/RT
是不可接受的(它不是可接受的键)。工作方法是传递一本字典,然后
解包
,这正是
**
所要做的。但是为什么您说Prod/RT不是一个可接受的键呢?Assign使用只接受字符串的kwargs。Prod/RT不能识别为字符串,因此它会抛出一个错误。因此采取了变通办法。
group = ['Machine', 'Type']

df1.assign(**{"Prod/RT" : lambda df1: df1.set_index(group)['Prod/RT']
                                         .fillna(df.set_index(group)['Prod/RT'])
                                         .fillna(0.002)
                                         .array})


  Machine Type  Prod     RT   Prod/RT
0      M1   A1   200  43200  0.004630
1      M2   D1     0      0  0.012500
2      M2   D2   180   3900  0.046154
3      M4   A2     0      0  0.008333
4     M44   A5     0      0  0.002000
5     M55   B4     0      0  0.002000