如何将含结构化参数的字符串列表转换为Pandas DataFrame?
如何将参数化文件名转换为Pandas DataFrame?
原输入列表的解法
其实你的原输入列表是可以实现需求的,只要参数值本身不包含下划线(从你给出的例子来看确实满足这个条件)。核心思路是用正则表达式匹配每个参数名__参数值的模块,把每个文件名解析成字典,再转换成DataFrame(缺失参数会自动填充NaN)。
具体代码实现如下:
import pandas as pd import re def parse_original_filename(filename): # 移除末尾的.pkl后缀 clean_name = filename.rstrip('.pkl') # 正则匹配:捕获包含下划线的参数名,以及对应的参数值(直到下一个下划线为止) pattern = r'([a-z_]+)__([^_]+)' matches = re.findall(pattern, clean_name) # 转换为参数字典 return {param: value for param, value in matches} # 原输入列表 original_input = ["number__128_alg__hello_min_n__7_max_n__9_full_seq__True_random_color__False_shuffle_shapes__False.pkl", "k__9_window__10_number__128_overlap__True_alg__hi_min_n__7_max_n__9_full_seq_embedding__False_random_color__False_shuffle_shapes__False.pkl", "k__9_window__10_number__128_overlap__True_alg__what_random_color__False_shuffle_shapes__False.pkl"] # 解析所有文件名 parsed_original = [parse_original_filename(f) for f in original_input] # 生成DataFrame df_original = pd.DataFrame(parsed_original) print(df_original)
这段代码会自动识别所有出现过的参数作为列,缺失参数的位置填充NaN。
修改后输入列表的解法
修改后的输入把参数名内部的下划线换成了点(比如random.color),这种格式更健壮——即使未来参数值包含下划线,也不会和参数名的分隔符混淆。解法思路和原输入类似,只需微调正则表达式的参数名匹配规则:
import pandas as pd import re def parse_modified_filename(filename): clean_name = filename.rstrip('.pkl') # 正则匹配:捕获包含点的参数名,以及对应的参数值 pattern = r'([a-z.]+)__([^_]+)' matches = re.findall(pattern, clean_name) return {param: value for param, value in matches} # 修改后的输入列表 modified_input = ["number__128_alg__hello_min.n__7_max.n__9_full.seq__True_random.color__False_shuffle.shapes__False.pkl", "k__9_window__10_number__128_overlap__True_alg__hi_min.n__7_max.n__9_full.seq__False_random.color__False_shuffle.shapes__False.pkl", "k__9_window__10_number__128_overlap__True_alg__what_random.color__False_shuffle.shapes__False.pkl"] parsed_modified = [parse_modified_filename(f) for f in modified_input] df_modified = pd.DataFrame(parsed_modified) print(df_modified)
关键说明
- 两种解法的核心都是利用正则精准匹配
参数名__参数值的结构,避免手动拆分时的歧义。 - Pandas的
DataFrame构造函数会自动合并所有字典的键作为列,缺失的键对应的值填充为NaN,完美满足你的需求。
内容的提问来源于stack exchange,提问作者Keshav M
相关产品推荐
相关产品推荐

