Before any serious analysis, you need a quick overview of a DataFrame. df.shape returns a tuple of (rows, columns), df.head(10) shows the first ten rows, and df.dtypes lists the data type of each column. The methods df.info() and df.describe() are particularly useful: info() prints column names, non-null counts, dtypes, and memory usage, giving a one-glance health check of the data, while describe() returns summary statistics such as count, mean, standard deviation, and the 25%, 50%, and 75% percentiles for every numeric column.
For categorical or discrete columns, df['col'].value_counts() returns the frequency of each unique value sorted in descending order, while df['col'].unique() lists the distinct values and df['col'].nunique() returns their count. The correlation matrix df.corr() produces pairwise Pearson correlation coefficients for all numeric columns and is often the first step toward understanding linear relationships between features.
Jupyter notebooks provide a rich environment for iterative data science, and a few built-in tools make them even more productive. The line magic %timeit runs a statement many times and reports its average execution time, which is ideal for benchmarking small snippets, while the cell magic %%time measures the wall time and CPU time of an entire cell in a single run. Keyboard shortcuts speed up navigation: Shift + Enter runs the current cell and advances, pressing Esc enters command mode, and A inserts a new cell above the active one. Finally, data flows in and out of notebooks through simple I/O functions: pd.read_csv('file.csv') loads a CSV (or a TSV with sep='\t'), and df.to_csv('output.csv', index=False) writes a DataFrame to disk, with index=False preventing the index from being saved as an extra column.