如何将.dat文件中的numpy数组匹配至pandas DataFrame对应行并添加为新列
解决方案
步骤拆解
- 初始化新列:先给目标DataFrame添加
col3列,默认填充NaN。 - 文件名与行名匹配:从
.dat文件名中提取和DataFrame行名对应的标识(比如从230109_exp3_foo.dat里提取exp3,对应行名row_exp3)。 - 读取文件并赋值:遍历所有
.dat文件,读取数据转为numpy数组,找到匹配的行后赋值到col3对应单元格。
完整代码示例
import pandas as pd import numpy as np import glob # 初始化已有DataFrame data = {'col1': [1, 2, 3, 4],'col2': ["a", "b", "c", "d"]} df = pd.DataFrame(data, index=['row_exp1','row_exp2','row_exp3','row_exp4']) # 1. 初始化col3列为NaN df['col3'] = np.nan # 2. 获取当前目录下所有.dat文件路径 dat_files = glob.glob('*.dat') # 3. 遍历文件,匹配行并赋值 for file_path in dat_files: # 从文件名提取匹配行名的核心标识 file_name = file_path.split('/')[-1] # 处理带路径的文件名 exp_id = file_name.split('_')[1] # 适配示例文件名格式:xxx_expX_xxx.dat,可根据实际调整规则 target_row = f'row_{exp_id}' # 校验目标行是否存在于DataFrame索引中 if target_row in df.index: # 读取.dat文件转为numpy数组(默认适配空格/制表符分隔的纯数值文件,格式特殊可换np.genfromtxt或自定义读取) arr = np.loadtxt(file_path) # 精准定位行和列赋值,避免链式赋值警告 df.loc[target_row, 'col3'] = arr print(df)
关键细节说明
- 文件名匹配逻辑:代码中用
split('_')[1]提取expX部分,你需要根据实际的文件名格式调整分割规则(比如文件名是exp1_raw.dat,就改成file_name.split('_')[0])。 - 数据读取适配:如果
.dat文件包含表头、非数值注释等内容,可改用np.genfromtxt()并设置skip_header参数,或者写自定义读取函数处理。 - 赋值方式:必须用
.loc[row, col]精准定位单元格,直接索引赋值可能触发pandas的链式赋值警告,导致数据更新异常。
内容的提问来源于stack exchange,提问作者Archimedes_91
相关产品推荐
相关产品推荐

