python - 通过另一个指标数据框评估一个数据框
问题描述
我有一个源数据框 input_df:
患者 ID KPI_Key1 KPI_Key2 KPI_Key3 0 1 (C602+C603) C601 NaN 1 2 (C605+C606) C602 NaN 2 3 75 L239+C602 NaN 3 4 (32*(C603+234)) 75 南 4 5 L239 南 C601
我有另一个指标数据框indicator_df
99 75 C604 C602 C601 C603 C605 C606 44 L239 32 患者 ID 1 1 0 1 0 1 0 0 0 1 0 1 2 0 0 0 0 0 0 1 1 0 0 0 3 1 1 1 1 0 1 1 1 1 1 1 4 0 0 0 0 0 1 0 1 0 1 0 5 1 0 1 1 1 1 0 1 1 1 1 6 0 1 0 0 0 0 0 0 0 0 0 7 1 1 1 1 1 1 1 1 1 1 1 8 0 0 0 0 0 0 0 0 0 0 0
现在,我需要生成这样的输出output_df
患者 ID KPI_Key1 KPI_Key2 KPI_Key3 0 1 0 1 0 1 2 1 0 0 2 3 1 1 0 3 4 0 0 0 4 5 1 0 1
output_df 是通过根据indicator_df “评估” input_df 中的输入公式获得的。
+ 表示 OR 条件 1 + 1 = 1 ;1 + 0 = 1 ; 0 + 0 = 0
* 表示 AND 条件。1 * 1 = 1;0 * 0 = 0 ; 1 * 0 = 0
资源 :
input_df = pd.DataFrame({'PatientID': [1,2,3,4,5], 'KPI_Key1': ['(C602+C603)','(C605+C606)','75','( 32*(C603+234))','L239'] , 'KPI_Key2' : ['C601','C602','L239+C602','75',''] , 'KPI_Key3' : ['', '','','','C601']})
indicator_df = pd.DataFrame({'PatientID': [1,2,3,4,5,6,7,8],'99' : ['1','0','1','0', '1','0','1','0'],'75' : ['0','0','1','0','0','1','1', '0'],'C604' : ['1','0','1','0','1','0','1','0'],'C602' : ['0 ','0','1','0','1','0','1','0'],'C601' : ['1','0','0','0 ','1','0','1','0'],'C603' : ['0','0','1','1','1','0','1 ','0'],'C605' : ['0','1','1','0','0','0','1','0'],'C606' : ['0','1','1','1','1','0','1','0'],'44' : ['1 ','0','1','0','1','0','1','0'],'L239' : ['0','0','1','1 ','1','0','1','0'], '32' : ['1','0','1','0','1','0','1 ','0'],}).set_index('PatientID')'32' : ['1','0','1','0','1','0','1','0'],}).set_index('PatientID')'32' : ['1','0','1','0','1','0','1','0'],}).set_index('PatientID')
output_df = pd.DataFrame({'PatientID': [1,2,3,4,5], 'KPI_Key1': ['0','1','1','0','1'] , ' KPI_Key2' : ['1','0','1','0','0'] ,'KPI_Key3' : ['0','0','0','0','1'] })
解决方案
最后我能够解决它:
final_out_df = pd.DataFrame()
for i in range(len(input_df)):
for j in ['KPI_Key1','KPI_Key2','KPI_Key3']:
exp = input_df[j].iloc[i]
#checking for NaN values
if exp == exp:
temp_out_df=indicator_df.eval(re.sub(r'(\w+)', r'`\1`', exp)).reset_index(name=j)
out_df['KPI_Key'] = input_df['KPI_Id'].iloc[i]
out_df = out_df.merge(temp_out_df, on='PateintID', how='left')
final_out_df= final_out_df.append(out_df)
out_df = pd.DataFrame(index=indicator_df.index)
out_df.reset_index(level=0, inplace=True)
final_out_df.index = range(len(final_out_df))
#filling NAN values to 0 and converting everything to int
final_out_df.fillna(0,inplace=True)
final_out_df[["KPI_Key1", "KPI_Key2", "KPI_Key3"]] = final_out_df[["KPI_Key1", "KPI_Key2", "KPI_Key3"]].astype(int)
#columns >1 = 1
final_out_df.loc[final_out_df['KPI_Key1'] >= 1, 'KPI_Key1'] = 1
final_out_df.loc[final_out_df['KPI_Key2'] >= 1, 'KPI_Key2'] = 1
final_out_df.loc[final_out_df['KPI_Key3'] >= 1, 'KPI_Key3'] = 1
推荐阅读
- python - 字典中的字典到熊猫数据框
- python - Pandas - 返回一行时如何排除空白单元格
- ios - 为什么应用程序在尝试加载我的 nib 文件时崩溃?
- c++ - C++ 变量列表初始化
- javascript - 我的函数在尝试渲染图像时返回一个承诺
- javascript - 页面加载时如何显示模式
- python - 为什么我的摩尔斯电码解码工具找不到任何后续字符?
- sql - 为什么 Hive 在使用按日期排序时会抛出错误?
- python - 是否有查找一个 netCDF 文件的最后一个时间戳和下一个 netCDF 文件的第一个时间戳之间差异的功能?
- python-3.x - 尝试通过 Pyinstaller 创建 exe 文件时,找不到隐藏的导入“pysqlite2”!