我有一个像这样的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”开头的行?
谢谢
答案 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