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
相关产品推荐
相关产品推荐

