如果我可以使用 read_csv 和自定义分隔符,为什么还要在 Pandas 中使用 read_fwf?

问题描述 投票:0回答:1

我不明白在 Pandas 中使用

read_fwf
有什么意义。为什么我要使用它而不是支持自定义分隔符的
read_csv
?我尝试测试大型固定列宽文件的速度,并且
read_csv
在我的机器上更快:

data = ("colum1    column2222   column3333   column4\n"
        "id8141    360.242940   149.910199   11950.7\n"
        "id1594    444.953632   166.985655   11788.4\n"
        )

colspecs = [(0, 6), (8, 20), (21, 33), (34, 43)]
data = data * 10000000

with open("big_file.txt", "w") as f:
    f.write(data)
start_time = time.time()
df = pd.read_csv("big_file.txt", header=None, dtype={"colum1": str, "column2222": float, "column3333": float, "column4":float}, sep="\s+")
print(f"--- {time.time() - start_time} seconds ---")
--- 4.0295188426971436 seconds ---
start_time = time.time()
df = pd.read_fwf("big_file.txt", header=None, colspecs=colspecs, 
                 dtype={"colum1": str, "column2222": float, "column3333": float, "column4":float})
print(f"--- {time.time() - start_time} seconds ---")
--- 77.41955280303955 seconds ---
python pandas dataframe csv
1个回答
3
投票

我不相信pandas API

read_fwf函数的存在是为了审美目的。核心开发人员让我们可以使用此功能,因为我们知道,在某些情况下,这是将文本文件正确读取为 DataFrame 的唯一有效方法。

我可以看到的示例之一(其中

read_fwf
派上用场)是下面的 (
.txt
) 文件:

87        foo
     341  5
bar  1    
 

除非你想出一个魔法/正则表达式分隔符,否则

read_csv
无法正确解析这3列。

df = pd.read_fwf("file.txt", widths=[4, 5, 4], names=["A", "B", "C"])

print(df)

     A      B    C
0   87    NaN  foo
1  NaN  341.0  5.0
2  bar    1.0  NaN
© www.soinside.com 2019 - 2024. All rights reserved.