如何解析CSV中嵌套列表字符串并填充到pandas DataFrame对应行列
解决方法
问题根源
你之前的代码直接对init_list整串按逗号分割,会把所有子数组的数值混为一维列表,无法拆分出每个国家对应的独立数值序列。
实现步骤
- 先从配置CSV中拆分出分类列表、国家列表,再把
init_list字符串拆解为对应每个国家的分类数值序列 - 按国家和分类的对应关系,给目标模板DataFrame的Increase列赋值
完整可运行代码
from io import StringIO import pandas as pd # 生成测试配置数据 data = """\ Categories Country init_list Rock,Paper,Scissors,Lizard,Spock AA,BB,CC,DD [1, 1, 1, 1, 1, 1, 1, 1],[.2, .2, .2, .2, .2, .2, .2, .2],[.8, .7, .7, .7, .8, .8, .8, .8],[1, 1, 1, 1, 1, 1, 1, 1] """ df_config = pd.read_csv(StringIO(data), sep="\s\s+", engine="python") # 初始化模板DataFrame df_template = pd.DataFrame({ "Categories": ["Rock", "Paper", "Scissors", "Lizard", "Spock"], "AA": [None]*5, "BB": [None]*5, "CC": [None]*5, "DD": [None]*5 }) # 逐行处理配置 for n in range(len(df_config)): # 拆分分类列表、国家列表 categories = [c.strip() for c in df_config.at[n, 'Categories'].split(',')] countries = [c.strip() for c in df_config.at[n, 'Country'].split(',')] # 拆解init_list字符串为4个独立数值列表,对应4个国家 init_str = df_config.at[n, 'init_list'] # 先去掉首尾括号,再按`],[`拆分出每个子数组的字符串 sub_list_strs = init_str.strip('[]').split('],[') # 每个子字符串转float列表,得到4个列表,长度和分类数一致 country_increase_vals = [list(map(float, s.split(','))) for s in sub_list_strs] # 给模板的Increase列赋值 for country, vals in zip(countries, country_increase_vals): col_name = f'Increse_{country}' df_template[col_name] = vals
输出结果
运行后得到的df_template和你需要的目标格式完全一致:
| Categories | AA | BB | CC | DD | Increse_AA | Increse_BB | Increse_CC | Increse_DD |
|---|---|---|---|---|---|---|---|---|
| Rock | None | None | None | None | 1.0 | 0.2 | 0.8 | 1.0 |
| Paper | None | None | None | None | 1.0 | 0.2 | 0.8 | 1.0 |
| Scissors | None | None | None | None | 1.0 | 0.2 | 0.7 | 1.0 |
| Lizard | None | None | None | None | 1.0 | 0.2 | 0.7 | 1.0 |
| Spock | None | None | None | None | 1.0 | 0.2 | 0.8 | 1.0 |
内容的提问来源于stack exchange,提问作者RSM
相关产品推荐
相关产品推荐

