如何将Pandas DataFrame验证错误的打印语句转换为字典
解决方案
你可以通过遍历无效值的Series,按行分组构建目标字典。以下是修改后的代码:
方法1:逐行遍历构建字典
valid= {'Industry': ['Automotive', 'Banking / Finance','Biotech / Pharma','Commercial Buildings','Construction / Distribution', 'Consumer Products','Education','Education - K-12','Education - University / Higher','Entertainment / Media','Financial', 'Food & Beverage','Gas','Government','Government - Federal','Government - State / Local','Healthcare','High Security', 'Hospitality / Entertainment','Manufacturing / Communications','Other','Petrochem / Energy', 'Property Management / Real Estate','Public Facility / Non-Profit','Residential','Restaurant','Retail','Services - B2B', 'Technology','Telecom / Utilities','Transportation','Utilities','Food Retail','Specialized Retail','IT','Corrections', 'Core Commercial (SME)'], 'SME Vertical': ['Agriculture, Food and Manufacturing','Architectural services','Arts, entertainment and recreation','Automobile', 'Chemistry / Pharmacy','Construction','Education','Hotels','Offices','Other Industries','Other Services', 'Project management and design','Real Estate and promotion','Restaurants, Café and Bars', 'Energy, Infrastructure, Environment and Mining','Financial and Insurance Services', 'Human health and social work activities','Professional, scientific, technical and communication activities', 'Public administration and defence, compulsory social security','Retail/Wholesale','Transport, Logistics and Storage'], 'System Type': ['Access','Access Control','Alarm Systems','Asset Tracking','Banking','Commander','EAS','Financial products','Fire', 'Fire Alarm','Integrated Solution','Intercom','Intercom systems','Intrusion - Traditional','Locking devices & Systems', 'Locks & Safes','Paging','Personal Safety','Retail & EAS Products','SaaS','SATS','Services', 'Sonitrol Integrated Solution','Sonitrol - Integrated Solution','Sonitrol - Managed Access', 'Sonitrol - Verified Audio Intrusion','Time & Attendance','TV-Distribution','Unknown','Video','Video Systems'], 'Account Type': ['Commercial','International','National','Regional','Reseller','Residential','Small']} mask = df1.apply(lambda c: c.isin(valid[c.name])) invalid_series = df1.mask(mask | df1.eq(' ')).stack() # 构建错误字典 error_dict = {} for (row_num, col_name), invalid_val in invalid_series.items(): row_key = f"row \"{row_num}\"" error_entry = { "column": col_name, "message": f"\"{invalid_val}\" is invalid" } # 同一行的错误存入列表 if row_key not in error_dict: error_dict[row_key] = [] error_dict[row_key].append(error_entry) # 打印查看结果 import pprint pprint.pprint(error_dict)
方法2:用groupby简化分组逻辑
如果需要更简洁的代码,可以用groupby按行号分组处理:
invalid_series = df1.mask(mask | df1.eq(' ')).stack() error_dict = {} for row_num, group in invalid_series.groupby(level=0): row_key = f"row \"{row_num}\"" error_dict[row_key] = [ {"column": col, "message": f"\"{val}\" is invalid"} for col, val in group.items() ]
输出效果
运行后会得到符合需求的字典结构:
{'row "1"': [{'column': 'Industry', 'message': '"gas" is invalid'}, {'column': 'SME Vertical', 'message': '"hotels" is invalid'}], 'row "2"': [{'column': 'Industry', 'message': '"healthcare" is invalid'}], 'row "3"': [{'column': 'Industry', 'message': '"other" is invalid'}, {'column': 'SME Vertical', 'message': '"project management and design" is invalid'}], 'row "4"': [{'column': 'Account Type', 'message': '"small" is invalid'}]}
这种结构能兼容同一行存在多个错误的场景,每个行键对应一个错误列表,列表中的每个元素包含错误的列名和提示信息。
内容的提问来源于stack exchange,提问作者user19702551
相关产品推荐
相关产品推荐

