Python如何从pandas读取的csv列表匹配指定代码并返回对应参数
原代码存在的问题
- 循环遍历逻辑错误:
for item, value in param_list['p_cd'], param_list['parm_nm']会把两个Series对象整体作为可迭代对象的两个元素,无法逐行配对获取代码和对应参数名,运行会直接报错 - 用Python原生循环遍历DataFrame效率极低,数据量较大时性能很差
- 目标代码列表硬编码在判断条件里,可读性和可维护性都不好
优化后代码(推荐)
import pandas as pd # 读取参数映射表 param_list = pd.read_csv(r'C:/Users/Gordo/Documents/GraduateSchool/Research/GroundWaterML/parameter_cd_query.csv') # 单独维护待匹配的目标代码列表,修改更方便 target_codes = ['p00010','p00020','p00025','p00058','p00059','p00090','p00095','p00191','p00300','p00301','p00400','p00405','p00410', 'p00450','p00452','p00453','p00602','p00607','p00608','p00613','p00618','p00631','p00660','p00666','p00671', 'p00681','p00900','p00904','p00905','p00915','p00925','p00930','p00931','p00932','p00935','p00940', 'p00945','p00950','p00955','p01000','p01005','p01010','p01020','p01025','p01030','p01035','p01040','p01046', 'p01049','p01060','p01065','p01080','p01085','p01090','p01106','p01130','p01145','p01155','p04035','p07000', 'p09511','p22703','p29801','p39086','p49933','p50624','p61028','p62636','p62639','p62642','p62645', 'p63041','p63162','p63790','p70300','p70301','p70303','p71846','p71851','p71856','p71865','p71870','p72015', 'p72016','p72019','p82081','p82082','p82085','p90095','p99832','p99833','p99834'] # 用pandas内置isin方法直接筛选命中的行,向量化操作效率远高于原生循环 match_result = param_list[param_list['p_cd'].isin(target_codes)][['p_cd', 'parm_nm']] # 打印结果,去掉索引更整洁 print(match_result.to_string(index=False)) # 如果需要导出结果到文件可使用以下代码 # match_result.to_csv('匹配结果.csv', index=False)
循环写法修正(不推荐,仅作错误参考)
如果一定要用循环实现,需要用zip方法把两个列打包成逐行配对的元组:
# 先把目标代码转成集合,in查询速度更快 target_code_set = set(target_codes) for item, value in zip(param_list['p_cd'], param_list['parm_nm']): if item in target_code_set: print(item, value)
注意事项
- 请检查csv文件中参数名称的列名是否和代码里的
parm_nm完全一致,避免拼写错误导致取值失败 - 目标代码转成集合后,
in操作的时间复杂度会从O(n)降到O(1),数据量越大性能提升越明显
内容的提问来源于stack exchange,提问作者Gordon Bowman
相关产品推荐
相关产品推荐

