使用Pandas读取CSV并处理注释
这是我用 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='!')
我遇到了两个问题。第一个是它会读取所有的行,注释行会被填充为 None 或 NaN,而且还会读取 BEGIN
和 END
标签。这导致单元格的索引出现偏移,这是我的第二个问题。
有没有正确的 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