Основываясь на этом ответе,
Как избежать KeyError в фрейме данных , я могу выполнить мои проверки. Но мне нужно следить за тем, какая строка терпит неудачу из-за какого условия проверки.
Есть ли способ добавить новый столбец и выдать сообщение об ошибке?
Мой код-
valid_dict = {'name': 'WI 80 INDEMNITY 18 OPTION 1 SILVER RX $10/45/90/25%',
'issuer_id': 484,
'service_area_id': 1,
'plan_year': 2018,
'network_url': np.nan,
'formulary_url': np.nan,
'sbc_download_url': np.nan,
'treatment_cost_calculator_url': np.nan,
'promotional_label': np.nan,
'hios_plan_identifier': '99806CAAUSJ-TMP',
'type': 'MetalPlan',
'price_period': 'Monthly',
'is_age_29_plan': False,
'sort_rank_override': np.nan,
'composite_rating': False,
}
data_obj = DataService()
hios_issuer_identifer_list = data_obj.get_hios_issuer_identifer(df)
d1 = {k: v for k, v in valid_dict.items() if k in set(valid_dict.keys()) - set(df.columns)}
df1 = df.assign(**d1)
cols_url = df.columns.intersection(['network_url', 'formulary_url', 'sbc_download_url', 'treatment_cost_calculator_url'])
m1 = (df1[['name', 'issuer_id', 'service_area_id']].notnull().all(axis=1))
m2 = (df1[['promotional_label']].astype(str).apply(lambda x: (x.str.len <= 65) | x.isin(['nan'])).all(axis=1))
m3 = (df1[cols_url].astype(str).apply(lambda x: (x.str.contains('\A(https?:\/\/)([a-zA-Z0-9\-_])*(\.)*([a-zA-Z0-9\-]+)\.([a-zA-Z\.]{2,5})(\.*.*)?\Z')) | x.isin(['nan'])).all(axis=1))
m4 = ((df1['plan_year'].notnull()) & (df['plan_year'].astype(str).str.isdigit()) & (df['plan_year'].astype(str).str.len() == 4))
m5 = ((df1['hios_plan_identifier'].notnull()) & (df['hios_plan_identifier'].str.len() >= 10) & (df['hios_plan_identifier'].str.contains('\A(\d{5}[A-Z]{2}[a-zA-Z0-9]{3,7}-TMP|\d{5}[A-Z]{2}\d{3,7}(\-?\d{2})*)\Z')))
m6 = (df1['type'].isin(['MetalPlan', 'MedicarePlan', 'BasicHealthPlan', 'DualPlan', 'MedicaidPlan', 'ChipPlan']))
m7 = (df1['price_period'].isin(['Monthly', 'Yearly']))
m8 = (df1['is_age_29_plan'].astype(str).isin(['True', 'False', 'nan']))
m9 = (df1[['sort_rank_override']].astype(str).apply(lambda x: (x.str.isdigit()) | x.isin(['nan'])).all(axis=1))
m10 = (df1['composite_rating'].astype(str).isin(['True', 'False']))
m11 = (df1['hios_plan_identifier'].astype(str).str[:5].isin(hios_issuer_identifer_list))
df1 = df1[m1 & m2 & m3 & m4 & m5 & m6 & m7 & m8 & m9 & m10 & m11].drop(d1.keys(), axis=1)
merged = df.merge(df1.drop_duplicates(), how='outer', indicator=True)
merged[merged['_merge'] == 'left_only'].to_csv('logs/invalid_plan_data.csv')
return df1
Что-то вроде ниже-
wellthie_issuer_identifier issuer_name ... service_area_id _error
0 UHC99806 Fake Humana ... 1 failed on plan_year