熊猫:读取以某个字符串开头的跳过线

时间:2018-01-19 09:41:18

标签: python pandas python-3.5

我有一个像这样的Pandas DataFrame:

[6 rows x 5 columns]
name     timestamp         value1  state         value2
Cs01  1.514483e+09         19.516      0  9.999954e-01   
Cs02  1.514483e+09         20.055      0  9.999363e-01   
Cs03  1.514483e+09         20.054      0  9.999970e-01   
Cs01  1.514483e+09         20.055      0  9.999949e-01   
Cs01  1.514483e+09         10.907      0  9.963121e-01   
Cs02  1.514483e+09         10.092      0  1.548312e-02  

是否可以使用read_csv函数跳过所有不以名称“Cs01”开头的行?

谢谢

2 个答案:

答案 0 :(得分:3)

最简单的是过滤所有行:

df = pd.read_csv('file')

df = df[df['name'].str.startswith('Cs01')]
print (df)
   name     timestamp  value1  state    value2
0  Cs01  1.514483e+09  19.516      0  0.999995
3  Cs01  1.514483e+09  20.055      0  0.999995
4  Cs01  1.514483e+09  10.907      0  0.996312

另一种解决方案是在预处理中获取所有行不包含Cs01,并在skiprows中使用参数read_csv

exclude = [i for i, line in enumerate(open('file.csv')) if not line.startswith('Cs01')]
print (exclude)
[0, 2, 3, 6]

df = pd.read_csv('file.csv', skiprows = exclude[1:])
print (df)
   name     timestamp  value1  state    value2
0  Cs01  1.514483e+09  19.516      0  0.999995
1  Cs01  1.514483e+09  20.055      0  0.999995
2  Cs01  1.514483e+09  10.907      0  0.996312

答案 1 :(得分:3)

一种方法是以块的形式读取文件,然后在块中过滤掉行,如果你有一个包含大量不需要的行的大文件在整个df中读取然后过滤,这可能会更快可能是不具备性能的:

In[17]:
t="""name     timestamp         value1  state         value2
Cs01  1.514483e+09         19.516      0  9.999954e-01   
Cs02  1.514483e+09         20.055      0  9.999363e-01   
Cs03  1.514483e+09         20.054      0  9.999970e-01   
Cs01  1.514483e+09         20.055      0  9.999949e-01   
Cs01  1.514483e+09         10.907      0  9.963121e-01   
Cs02  1.514483e+09         10.092      0  1.548312e-02"""
d = pd.read_csv(io.StringIO(t), delim_whitespace=True, chunksize=2)
dfs = pd.concat([x[x['name'].str.startswith('Cs01')] for x in d])
dfs

Out[17]: 
   name     timestamp  value1  state    value2
0  Cs01  1.514483e+09  19.516      0  0.999995
3  Cs01  1.514483e+09  20.055      0  0.999995
4  Cs01  1.514483e+09  10.907      0  0.996312

这里chunksize param指定要读取的行数,您可以将其设置为某个arbritrary大小,然后对每个块执行列表推导和过滤,然后调用concat以生成单df