df.mean(axis=1)返回全NaN值的技术求助
咱们来一步步排查为什么你的行均值全是NaN——我之前处理制表符分隔的批量文件时也踩过类似的坑,下面是最可能的原因和对应的解决办法:
1. 读取的列不是数值类型(最常见原因)
如果你的文本文件里包含非数值字符(比如空格、注释符号、无关字符串),Pandas会把列的类型设为object(字符串型),这时调用mean(axis=1)自然会返回NaN——因为字符串没法计算均值。
排查方式:在循环里加一行打印数据类型,快速验证:
with open(os.path.join(path, file)) as f: df = pd.read_csv(f, sep="\t", header=1) print(f"文件 {file} 的列类型:\n{df.dtypes}") # 查看每列的数据类型 dfs.append(df)
如果输出里大部分列都是object类型,那就是这个问题。
解决办法:
- 先打开一个
C1_LRC.TXT文件,手动检查数据行里有没有非数值内容; - 用
pd.to_numeric强制转换目标列,或者在读取时指定类型:
# 读取时强制所有列为浮点型 df = pd.read_csv(f, sep="\t", header=1, dtype=float) # 或者只转换目标列,把非数值转成NaN df['你的目标列名'] = pd.to_numeric(df['你的目标列名'], errors='coerce')
2. 你可能没提取「目标列」,而是拼接了所有列
你提到要“将每个文件中的目标列合并”,但当前代码是把整个DataFrame都加入了dfs列表,然后横向拼接。如果每个原始文件有很多无关列(比如注释列、序号列),这些列大概率是非数值型,会导致整个行的均值计算失效。
修正方式:在循环里只提取你需要的目标列,比如假设目标列叫LRC_Data:
with open(os.path.join(path, file)) as f: df = pd.read_csv(f, sep="\t", header=1) target_col = df['LRC_Data'] # 替换成你实际的目标列名 dfs.append(target_col)
这样拼接后的big_frame只会包含你需要的数值列,计算均值就正常了。
3. header=1参数可能用错了
header=1表示用文件的第2行(索引从0开始)作为列名,但如果你的文件前两行都是注释/说明文字,实际数据从第3行开始,那这个参数会把第2行的文字当成列名,导致后续的数据读取混乱,甚至全是NaN。
排查方式:打印第一个读取的文件内容,验证数据是否正确:
with open(os.path.join(path, file)) as f: df = pd.read_csv(f, sep="\t", header=1) print(f"文件 {file} 的前5行:\n{df.head()}") break # 只看第一个文件的内容
如果看到列名是奇怪的字符串,或者数据全是NaN,可以试试header=None(不用表头,用默认列名),或者skiprows=2(跳过前两行,从第三行开始读数据)。
4. 分隔符不是真正的制表符
你指定了sep="\t",但有些文件看起来是制表符分隔,实际是用多个空格或者空格+制表符混合,这会导致Pandas无法正确拆分列,所有数据挤在一列里,或者列拆分错误变成非数值型。
修正方式:用sep="\s+"匹配任意空白字符(包括空格和制表符)试试:
df = pd.read_csv(f, sep="\s+", header=1)
假设你需要提取每个文件的第3列(索引为2)作为目标列,代码可以改成这样:
import os import pandas as pd path = 'C:/.../...' dfs = [] for file in os.listdir(path): if file.endswith('C1_LRC.TXT'): file_path = os.path.join(path, file) # 跳过前两行注释,用任意空白分隔,只取第3列 df = pd.read_csv(file_path, sep="\s+", skiprows=2, usecols=[2], header=None) # 确保列是数值型,非数值转NaN df = df.apply(pd.to_numeric, errors='coerce') dfs.append(df) big_frame = pd.concat(dfs, axis=1, ignore_index=True) big_frame['average'] = big_frame.mean(axis=1) print(big_frame)
内容的提问来源于stack exchange,提问作者Martina Lazzarin

