如何在从列表构造pandas.DataFrame时模拟read_csv的converters功能
实现方案
你可以通过列映射+函数应用的方式完美模拟pandas.read_csv的converters参数功能,支持多列自定义转换规则,具体实现如下:
基础实现(兼容性最高,代码改造成本最低)
直接复用你已有的dict_converters规则字典,在构建DataFrame后对指定列批量应用转换函数即可:
import pandas as pd # 你的原始嵌套列表数据 data = [["sports", "population"], ["football", "15M"], ["darts", "50k"], ["sailing", 3000]] # 原有转换函数、规则字典无需修改 def f_population_to_int(population): dict_multiplier={"k": 1000, "M": 1000000} try: multiplier = dict_multiplier[population[-1]] return int(population[0:-1]) * multiplier except KeyError: return int(population) dict_converters = {"population": f_population_to_int} # 1. 先构建基础DataFrame df = pd.DataFrame(data[1:], columns=data[0]) # 2. 模拟converters逻辑,批量应用转换规则 for col, converter_func in dict_converters.items(): df[col] = df[col].apply(converter_func)
执行后得到的df和你用read_csv加converters参数输出的结果完全一致。
多列转换示例
如果需要对多列应用不同转换规则,只需在dict_converters中添加对应列和转换函数即可,其他代码无需调整:
# 新增列的转换函数示例:将项目名称转为大写 def f_sport_to_upper(sport_name): return sport_name.upper() # 规则字典新增列映射 dict_converters = { "population": f_population_to_int, "sports": f_sport_to_upper }
大数据量优化方案
如果数据量极大,不想先构建完整原始DataFrame再转换,可以在建表前提前处理每行的对应字段,降低内存占用:
# 提前映射需要转换的列的索引位置 col_idx_map = {col: idx for idx, col in enumerate(data[0])} convert_rule = {col_idx_map[col]: func for col, func in dict_converters.items()} # 逐行处理数据 processed_data = [] for row in data[1:]: new_row = row.copy() for idx, func in convert_rule.items(): new_row[idx] = func(new_row[idx]) processed_data.append(new_row) # 直接生成转换完成的DataFrame df = pd.DataFrame(processed_data, columns=data[0])
内容的提问来源于stack exchange,提问作者Lionel Hamayon
相关产品推荐
相关产品推荐

