You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在从列表构造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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 05:39:03