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

Pandas读取CSV生成NaN索引及避免无用列的技术问询

解决Pandas读取特殊格式CSV的dummy列与NaN问题

嘿,我来帮你搞定这个读取CSV的小麻烦!你的CSV每行都是A: X, B: Y的格式,用正则分隔时容易产生无用列和NaN,下面给你两种靠谱的解决办法:

方法1:直接提取目标值(最省心)

这种方法先把每行内容读成一个字符串,再用正则精准抠出A和B的数值,完全绕开分隔符的坑:

import pandas as pd

# 先把每行数据整成一列,避免提前分割出错
df = pd.read_csv("test.csv", header=None, names=["raw"])

# 用正则提取A和B后面的数字,括号就是要捕获的目标值
df[["A", "B"]] = df["raw"].str.extract(r"A:\s*(\d+),\s*B:\s*(\d+)")

# 把提取到的字符串转成整数(如果是浮点数就用astype(float))
df = df[["A", "B"]].astype(int)

print(df)

运行后你会得到干净的结果:

A   B
0  12  14
1   1   4
2   2   1
3  21  41

方法2:优化正则分隔符(直接读取时过滤无用列)

如果你坚持想用sep参数分割,可以调整正则表达式,同时跳过不需要的空列:

import pandas as pd

# 正则匹配"A: "或者", B: "作为分隔符,注意engine要选python才支持复杂正则
df = pd.read_csv(
    "test.csv",
    sep=r"A:\s*|,\s*B:\s*",
    names=["", "A", "B"],  # 第一个空列对应分割后开头的空字符串
    engine="python",
    usecols=["A", "B"]  # 只保留我们需要的A和B列
)

# 转换数据类型
df = df.astype(int)
print(df)

为啥你原来的方法会出问题?

你一开始用的sep = ":\s*|,\s*"会把每行拆成4个部分:["A", "12", "B", "14"],所以必须指定4个列名,自然就冒出了dummy1和dummy2这些没用的列。

至于你遇到的NaN问题,是因为你尝试的sep = "A:\s*|,\s*B:\s*"会把第一行拆成["", "12", "14"],如果指定的列名数量和分割后的元素数对不上,Pandas就会自动补NaN。要么让列名数量匹配,要么直接用方法1的提取方式从根源避免这个问题~

内容的提问来源于stack exchange,提问作者Mr. T

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:23:22