给出了两个数据框,一个是参数数据框,另一个是输入数据框。基本上,我们需要根据条件加入两个数据框。
import pandas as pd
import numpy as np
para_df=pd.DataFrame({'parameter': ['param1', 'param2', 'param3*param4', 'param5', 'param6*param7*param8'],
'level1': ['A1','A2','A3','A4','A5'],
'level2':[np.NaN,np.NaN,'B3',np.NaN,'B5'],
'level3':[np.NaN,np.NaN,np.NaN,np.NaN,'C6'],
'level4':[np.NaN,np.NaN,np.NaN,np.NaN,np.NaN],
'estimatation':[10,20,30,40,50]})
output of para_df
estimatation level1 level2 level3 level4 parameter
10 A1 NaN NaN NaN param1
20 A2 NaN NaN NaN param2
30 A3 B3 NaN NaN param3*param4
40 A4 NaN NaN NaN param5
50 A5 B5 C6 NaN param6*param7*param8
input_df=pd.DataFrame({'param1' : ['A1','A1','A1'],
'param2' : ['A2','A2','A2'],
'param3' : ['A3','A3','A3'],
'param4' : ['B3','B3','B3'],
'param5' : ['A4','A4','A4'],
'param6' : ['A5','A5','A5'],
'param7' : ['B5','B5','B5'],
'param8' : ['C6','C6','C6']})
output of input_df=
param1 param2 param3 param4 param5 param6 param7 param8
A1 A2 A3 B3 A4 A5 B5 C6
A1 A2 A3 B3 A4 A5 B5 C6
A1 A2 A3 B3 A4 A5 B5 C6
for _, row in para_df.iterrows():
if '*' not in row['parameter']:
input_df.loc[input_df[row['parameter']] == row['level1'],row['parameter']+'pe'] = row['estimatation']
else:
params = row['parameter'].split('*')
print(params)
conditions = ["input_df[row[{}] == row[{}]".format(params[i-1], 'level'+str(i)) for i in range(1, len(params)+1 )]
all_condition = "&".join(conditions)
print(all_condition)
input_df.loc[all_condition ,row['parameter']+'pe'] = row['estimatation']
我想基于all_condition获得输出。但是我无法获得预期的数据帧。
param1 param2 param3 param4 param5 param6 param7 param8 param1pe param2pe param5pe param3*param4pe param6*param7*param8pe
0 A1 A2 A3 B3 A4 A5 B5 C6 10.0 20.0 40.0 NaN NaN
1 A1 A2 A3 B3 A4 A5 B5 C6 10.0 20.0 40.0 NaN NaN
2 A1 A2 A3 B3 A4 A5 B5 C6 10.0 20.0 40.0 NaN NaN
input_df[row[param3] == row[level1]&input_df[row[param4] == row[level2] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 30.0 NaN
input_df[row[param6] == row[level1]&input_df[row[param7] == row[level2]&input_df[row[param8] == row[level3] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 50.0