使用Pandas读取CSV并处理注释

1 投票
2 回答
1251 浏览
提问于 2025-04-18 18:55

这是我用 Pandas 读取的数据文件的一个例子。所有的文件都有不同数量的注释行,但它们的数据部分都是以 BEGIN 开头,以 END 结尾,后面可能还有一个空行。

!Example data file
!With commands delimited by exclamation points
!Not always the some number of comment lines
BEGIN
300,-1.0342501,-0.07359
5298,-0.9889674,0.06514
1029,-0.981307,0.130398
1529,-0.971765,0.1945281
END

这是我用来读取这些文件的 Pandas 代码。

b = pd.read_csv(data_file,,names=['Frequency','Real','Imaginary'],comment='!') 

我遇到了两个问题。第一个是它会读取所有的行,注释行会被填充为 NoneNaN,而且还会读取 BEGINEND 标签。这导致单元格的索引出现偏移,这是我的第二个问题。

有没有正确的 Pandas 方法可以读取这些文件,同时去掉注释行和 BEGIN 以及 END 标签?有没有一种优雅的一行代码可以解决我的两个问题?

2 个回答

1

这是你代码的一个变种:

In [125]: df = pd.read_csv('data_file.csv', comment='!', header=0, names=['Frequency','Real','Imaginary'], na_values=['END'])

In [126]: df
Out[126]: 
   Frequency      Real  Imaginary
0        300 -1.034250  -0.073590
1       5298 -0.988967   0.065140
2       1029 -0.981307   0.130398
3       1529 -0.971765   0.194528
4        NaN       NaN        NaN

最后一行的'END'被转成了NaN(不是一个数字),所以我们需要把最后一行删掉:

In [127]: df = df.iloc[:-1]    # or `df = df.dropna()`

In [128]: df
Out[128]: 
   Frequency      Real  Imaginary
0        300 -1.034250  -0.073590
1       5298 -0.988967   0.065140
2       1029 -0.981307   0.130398
3       1529 -0.971765   0.194528
2

怎么样,把整个文件导入,然后把第二个字段为空的内容都去掉呢?

import pandas as pd
import numpy as np    
b = pd.read_csv('sample2.csv',names=['Frequency','Real','Imaginary'],comment='!')
isnotnan = lambda x: not(np.isnan(x))
b2 = b[b['Real'].apply(isnotnan)]

结果 b:

  Frequency      Real  Imaginary
0       NaN       NaN        NaN
1       NaN       NaN        NaN
2       NaN       NaN        NaN
3     BEGIN       NaN        NaN
4       300 -1.034250  -0.073590
5      5298 -0.988967   0.065140
6      1029 -0.981307   0.130398
7      1529 -0.971765   0.194528
8       END       NaN        NaN

结果 b2:

  Frequency      Real  Imaginary
4       300 -1.034250  -0.073590
5      5298 -0.988967   0.065140
6      1029 -0.981307   0.130398
7      1529 -0.971765   0.194528

要重置索引:

b3 = b2.reset_index(drop = True)

b3 的输出:

  Frequency      Real  Imaginary
0       300 -1.034250  -0.073590
1      5298 -0.988967   0.065140
2      1029 -0.981307   0.130398
3      1529 -0.971765   0.194528

撰写回答