In this tutorial, we'll look at how to read CSV files by read_csv
and skip rows with a conditional statement in Pandas.
In addition, we'll also see how to optimise the reading performance of the read_csv
method with Dask. This option is useful if you face memory issues using read_csv
.
To start let's say that we have the following CSV file:
gender | race/ethnicity | math score | reading score | writing score |
---|---|---|---|---|
female | group B | 72 | 72 | 74 |
female | group C | 69 | 90 | 88 |
female | group B | 90 | 95 | 93 |
male | group A | 47 | 57 | 44 |
male | group C | 76 | 78 | 75 |
1000 rows × 8 columns
Step 1: Read CSV file skip rows with query condition in Pandas
By default Pandas skiprows
parameter of method read_csv
is supposed to filter rows based on row number and not the row content.
So the default behavior is:
pd.read_csv(csv_file, skiprows=5)
The code above will result into:
995 rows × 8 columns
But let's say that we would like to skip rows based on the condition on their content. This can be achieved by reading the CSV file in chunks with chunksize
.
The results will be filtered by query
condition:
gen = pd.read_csv(csv_file, chunksize=10000000)
df = pd.concat((x.query("lunch == 'standard'") for x in gen), ignore_index=True)
result:
645 rows × 8 columns
The above code will filter CSV rows based on column lunch
. It will return only rows containing standard
to the output.
Step 2: Read CSV file with condition value higher than threshold
In this step we are going to compare the row value in the rows against integer value. If the value is equal or higher we will load the row in the CSV file.
Difference with the previous step is:
- the usage of
dtype
parameter which defines a schema for the columns read from the CSV file - how to use query with column which contains space -
math score
- surrounded by `
schema={
"math score": int
}
gen = pd.read_csv(csv_file, dtype=schema, chunksize=10000000)
df = pd.concat((x.query("`math score` >= 75") for x in gen), ignore_index=True)
The code above will filter all rows which contain math score
higher or equal to 75:
295 rows × 8 columns
Step 3: Read CSV file and post filter condition in Pandas
For small and medium CSV files it's fine to read the whole file and do a post filtering based on read values.
This can be achieved by:
df = pd.read_csv(csv_file)
df = df[df['lunch'] != 'standard']
result:
355 rows × 8 columns
So first we read the whole file. Next we are filtering the results based on one or multiple conditions.
Step 4: Read CSV with conditional filtering by Dask
Finally let's see how to read a CSV file with condition and optimised performance.
To install Dask use:
pip install dask
Dask offers a lazy reader which can optimize performance of read_csv
.
So first we can read the CSV file, then apply the filtering and finally to compute the results:
import dask.dataframe as dd
df = dd.read_csv(csv_file)
df = df[(df['reading score'] >= 55) & (df['reading score'] <= 75)]
df = df.compute()
result is:
496 rows × 8 columns