πΌ Pandas
Pandas is a popular Python library used for working with, analyzing, and manipulating data.
It is especially useful for working with tables of data, similar to Excel spreadsheets.
π¦ Installing Pandas
Pandas is an external library, so install it using pip:
pip install pandasThen import it:
import pandas as pdπ DataFrame
The most important Pandas object is a DataFrame.
A DataFrame is a 2-dimensional table with rows and columns.
import pandas as pd
data = {
"Name": ["Tisha", "Rahul", "Anu"],
"Age": [23, 25, 21]
}
df = pd.DataFrame(data)
print(df) Name Age
0 Tisha 23
1 Rahul 25
2 Anu 21π Series
A Series is a single column of data.
A Series is a 1-dimensional table with rows and columns.
ages = pd.Series([23, 25, 21])
print(ages)0 23
1 25
2 21π Common Pandas Operations
df.head() # First few rows
df.tail() # Last few rows
df.info() # Information about data
df.describe() # Statistics
df["Age"] # Select a column
df.dropna() # Remove missing valuesπ Reading a CSV File
Pandas makes it easy to work with files:
df = pd.read_csv("students.csv")
print(df)You can also save data:
df.to_csv("output.csv", index=False)β Remember
Pandas = Python library for working with structured/tabular data.
<div class="infographic-pypandas">
<style>
.infographic-pypandas {
--ink:#1a1a1a; --ink-soft:#5c5c5c; --paper:#fff; --paper-alt:#f0ece4;
--accent:#2563eb; --accent-soft:#e3ebfd; --line:#ddd6c9;
--drop:#c0392b; --drop-soft:#fbe9e7;
--mono-font:'IBM Plex Mono','SFMono-Regular',Menlo,monospace;
--display-font:'Fraunces',Georgia,serif; --body-font:'Inter',system-ui,sans-serif;
box-sizing:border-box; max-width:720px; margin:0 auto; font-family:var(--body-font); color:var(--ink); background:var(--paper);
}
.infographic-pypandas[data-theme="dark"] {
--ink:#e8e6e1; --ink-soft:#9a968c; --paper:#121212; --paper-alt:#1e1e26;
--accent:#5b8def; --accent-soft:#202942; --line:#2c313d;
--drop:#e57373; --drop-soft:#3a2222;
}
.infographic-pypandas *,.infographic-pypandas *::before,.infographic-pypandas *::after{box-sizing:border-box;}
.infographic-pypandas .pd-wrap{padding:0 clamp(1rem,4vw,2rem) 1.5rem;}
.infographic-pypandas h1{font-family:var(--display-font);font-weight:600;font-size:clamp(1.4rem,5vw,1.9rem);text-align:center;margin:1.5rem 0 0.25rem;letter-spacing:-0.01em;}
.infographic-pypandas .pd-sub{text-align:center;color:var(--ink-soft);font-size:0.85rem;margin:0 0 1.3rem;}
.infographic-pypandas .code-line{text-align:center;font-family:var(--mono-font);font-size:0.8rem;color:var(--ink-soft);margin-bottom:1rem;}
.infographic-pypandas .code-line strong{color:var(--accent);}
.infographic-pypandas table.df{border-collapse:collapse;margin:0 auto;font-family:var(--mono-font);font-size:0.8rem;width:100%;}
.infographic-pypandas table.df th,.infographic-pypandas table.df td{border:1px solid var(--line);padding:0.4rem 0.6rem;text-align:center;transition:background .25s,color .25s,opacity .25s;}
.infographic-pypandas table.df th{background:var(--paper-alt);color:var(--ink-soft);cursor:pointer;}
.infographic-pypandas table.df th.hl{background:var(--accent-soft);color:var(--accent);}
.infographic-pypandas table.df td.row-hl{background:var(--accent-soft);color:var(--accent);font-weight:700;}
.infographic-pypandas table.df td.row-dim{opacity:0.3;}
.infographic-pypandas table.df td.is-nan{color:var(--drop);font-style:italic;}
.infographic-pypandas table.df th.idx,.infographic-pypandas table.df td.idx{color:var(--ink-soft); font-weight:400; background:var(--paper);}
.infographic-pypandas .result-area{margin-bottom:1rem;}
.infographic-pypandas pre.pd-pre{
font-family:var(--mono-font); font-size:0.74rem; line-height:1.6; background:var(--paper-alt);
border:1px solid var(--line); border-radius:8px; padding:0.7rem 0.85rem; overflow-x:auto; color:var(--ink); margin:0;
}
.infographic-pypandas .btn-row{display:flex;justify-content:center;gap:0.4rem;margin-bottom:0.6rem;flex-wrap:wrap;}
.infographic-pypandas .pd-btn{font:inherit;font-family:var(--mono-font);font-size:0.76rem;font-weight:700;background:var(--paper-alt);border:1.5px solid var(--line);color:var(--ink);padding:0.4rem 0.65rem;cursor:pointer;border-radius:6px;}
.infographic-pypandas .pd-btn.is-selected{border-color:var(--accent);color:var(--accent);background:var(--accent-soft);}
.infographic-pypandas .filter-row{display:flex;justify-content:center;gap:0.4rem;margin-bottom:0.9rem;flex-wrap:wrap;align-items:center;}
.infographic-pypandas .filter-row span{font-family:var(--mono-font);font-size:0.8rem;color:var(--ink-soft);}
.infographic-pypandas .filter-row input{
font-family:var(--mono-font);font-size:0.8rem;padding:0.35rem 0.5rem;border:1.5px solid var(--line);border-radius:5px;background:var(--paper-alt);color:var(--ink);
}
.infographic-pypandas .filter-row input{width:70px;text-align:center;}
.infographic-pypandas .result-line{text-align:center;font-family:var(--mono-font);font-size:0.85rem;font-weight:700;color:var(--accent);margin:0.8rem 0 0.4rem;min-height:1.3em;word-break:break-word;}
.infographic-pypandas .pd-caption{text-align:center;font-size:0.85rem;color:var(--ink-soft);margin-top:0.6rem;}
@media (prefers-reduced-motion:reduce){.infographic-pypandas *,.infographic-pypandas *::before,.infographic-pypandas *::after{animation-duration:.001ms!important;transition-duration:.001ms!important;}}
</style>
<div class="pd-wrap">
<h1>Pandas</h1>
<p class="pd-sub">A DataFrame is a table you can peek at, select from, filter, and summarize in one line.</p>
<div class="code-line">df = pd.DataFrame({"name": [...], "age": [...], "city": [...]})</div>
<div class="result-area" id="dfTableWrap"></div>
<div class="btn-row">
<button class="pd-btn is-selected" data-action="full">df</button>
<button class="pd-btn" data-action="head">df.head()</button>
<button class="pd-btn" data-action="tail">df.tail()</button>
<button class="pd-btn" data-action="info">df.info()</button>
<button class="pd-btn" data-action="describe">df.describe()</button>
<button class="pd-btn" data-action="col" data-col="age">df["age"]</button>
<button class="pd-btn" data-action="dropna">df.dropna()</button>
</div>
<div class="filter-row">
<span>df[df["age"] ></span>
<input id="filterVal" type="text" value="28" />
<span>]</span>
<button class="pd-btn" id="filterBtn">Run filter</button>
</div>
<p class="result-line" id="pdResult"></p>
<p class="pd-caption" id="pdCaption">Click a button above β the table (or its summary) updates live.</p>
</div>
<script>
(function(){
var root = document.currentScript.closest('.infographic-pypandas') || document.querySelector('.infographic-pypandas');
var bodyAttr = document.body.getAttribute('data-darkmode');
var dark = bodyAttr === 'true' ? true : bodyAttr === 'false' ? false : (document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/) || [])[1] === 'true';
if (dark) root.setAttribute('data-theme', 'dark');
var data = [
{ name: 'Alice', age: 25, city: 'NYC' },
{ name: 'Bob', age: 30, city: 'LA' },
{ name: 'Chen', age: 28, city: 'SF' },
{ name: 'Dara', age: 35, city: 'NYC' },
{ name: 'Eve', age: null, city: 'LA' },
{ name: 'Frank', age: 22, city: null }
];
var cols = ['name', 'age', 'city'];
var tableWrap = root.querySelector('#dfTableWrap');
var resultEl = root.querySelector('#pdResult');
var captionEl = root.querySelector('#pdCaption');
function fmt(v) { return v === null || v === undefined ? 'NaN' : v; }
function renderTable(rows, opts) {
opts = opts || {};
var table = document.createElement('table');
table.className = 'df';
var thead = document.createElement('tr');
var thIdx = document.createElement('th'); thIdx.className = 'idx'; thead.appendChild(thIdx);
cols.forEach(function (c) {
var th = document.createElement('th');
th.textContent = c;
th.className = c === opts.hlCol ? 'hl' : '';
th.addEventListener('click', function () { applyCol(c); });
thead.appendChild(th);
});
table.appendChild(thead);
rows.forEach(function (item) {
var row = item.row, i = item.idx;
var tr = document.createElement('tr');
var tdIdx = document.createElement('td'); tdIdx.className = 'idx'; tdIdx.textContent = i; tr.appendChild(tdIdx);
var matches = opts.matchFn ? opts.matchFn(row) : true;
cols.forEach(function (c) {
var td = document.createElement('td');
td.textContent = fmt(row[c]);
if (row[c] === null) td.classList.add('is-nan');
if (c === opts.hlCol) td.classList.add('row-hl');
if (opts.matchFn && !matches) td.classList.add('row-dim');
tr.appendChild(td);
});
table.appendChild(tr);
});
tableWrap.innerHTML = '';
tableWrap.appendChild(table);
}
function allRows() { return data.map(function (row, i) { return { row: row, idx: i }; }); }
function renderPre(text) {
var pre = document.createElement('pre');
pre.className = 'pd-pre';
pre.textContent = text;
tableWrap.innerHTML = '';
tableWrap.appendChild(pre);
}
function clearBtns() { root.querySelectorAll('.pd-btn').forEach(function (b) { b.classList.remove('is-selected'); }); }
function applyCol(col) {
clearBtns();
renderTable(allRows(), { hlCol: col });
resultEl.textContent = 'df["' + col + '"] β [' + data.map(function (r) { return fmt(r[col]); }).join(', ') + ']';
captionEl.textContent = 'Selecting a column returns a Series β same values, one column wide.';
}
root.querySelector('.pd-btn[data-action="full"]').addEventListener('click', function () {
clearBtns(); this.classList.add('is-selected');
renderTable(allRows(), {});
resultEl.textContent = '';
captionEl.textContent = 'The whole DataFrame β 6 rows, including two missing values (NaN).';
});
root.querySelector('.pd-btn[data-action="head"]').addEventListener('click', function () {
clearBtns(); this.classList.add('is-selected');
var rows = allRows().slice(0, 5);
renderTable(rows, {});
resultEl.textContent = 'df.head() β first 5 rows';
captionEl.textContent = 'head() defaults to 5 rows β handy for a quick peek at a big table.';
});
root.querySelector('.pd-btn[data-action="tail"]').addEventListener('click', function () {
clearBtns(); this.classList.add('is-selected');
var rows = allRows().slice(-5);
renderTable(rows, {});
resultEl.textContent = 'df.tail() β last 5 rows';
captionEl.textContent = 'tail() is head()\'s mirror β the most recent rows instead of the first.';
});
root.querySelector('.pd-btn[data-action="info"]').addEventListener('click', function () {
clearBtns(); this.classList.add('is-selected');
var n = data.length;
var lines = [];
lines.push("<class 'pandas.core.frame.DataFrame'>");
lines.push('RangeIndex: ' + n + ' entries, 0 to ' + (n - 1));
lines.push('Data columns (total ' + cols.length + ' columns):');
lines.push(' # Column Non-Null Count Dtype');
lines.push('--- ------ -------------- -----');
cols.forEach(function (c, i) {
var nonNull = data.filter(function (r) { return r[c] !== null; }).length;
var dtype = c === 'age' ? 'float64' : 'object';
lines.push(' ' + i + ' ' + c.padEnd(6) + ' ' + (nonNull + ' non-null').padEnd(14) + ' ' + dtype);
});
lines.push('dtypes: float64(1), object(2)');
renderPre(lines.join('\n'));
resultEl.textContent = 'df.info()';
captionEl.textContent = 'info() shows dtypes and which columns actually have missing values β age and city both do.';
});
root.querySelector('.pd-btn[data-action="describe"]').addEventListener('click', function () {
clearBtns(); this.classList.add('is-selected');
var ages = data.map(function (r) { return r.age; }).filter(function (v) { return v !== null; }).sort(function (a, b) { return a - b; });
var n = ages.length;
var mean = ages.reduce(function (a, b) { return a + b; }, 0) / n;
var variance = ages.reduce(function (a, b) { return a + (b - mean) * (b - mean); }, 0) / (n - 1);
var std = Math.sqrt(variance);
function pct(p) {
var idx = (n - 1) * p;
var lo = Math.floor(idx), hi = Math.ceil(idx);
if (lo === hi) return ages[lo];
return ages[lo] + (ages[hi] - ages[lo]) * (idx - lo);
}
var stats = [
['count', n],
['mean', mean.toFixed(2)],
['std', std.toFixed(2)],
['min', ages[0]],
['25%', pct(0.25).toFixed(2)],
['50%', pct(0.5).toFixed(2)],
['75%', pct(0.75).toFixed(2)],
['max', ages[n - 1]]
];
var lines = [' age'];
stats.forEach(function (s) { lines.push(s[0].padEnd(5) + ' ' + s[1]); });
renderPre(lines.join('\n'));
resultEl.textContent = 'df.describe()';
captionEl.textContent = 'describe() only summarizes numeric columns β age is the only one here β and it skips NaN automatically.';
});
root.querySelector('.pd-btn[data-action="col"]').addEventListener('click', function () {
applyCol(this.dataset.col);
});
root.querySelector('.pd-btn[data-action="dropna"]').addEventListener('click', function () {
clearBtns(); this.classList.add('is-selected');
var rows = allRows();
renderTable(rows, { matchFn: function (row) { return cols.every(function (c) { return row[c] !== null; }); } });
var kept = data.filter(function (row) { return cols.every(function (c) { return row[c] !== null; }); });
resultEl.textContent = 'df.dropna() β ' + kept.length + ' of ' + data.length + ' rows kept (dimmed rows had a NaN)';
captionEl.textContent = 'dropna() removes any row with at least one missing value, in any column.';
});
root.querySelector('#filterBtn').addEventListener('click', function () {
clearBtns();
var v = parseFloat(root.querySelector('#filterVal').value) || 0;
var rows = allRows();
renderTable(rows, { matchFn: function (row) { return row.age !== null && row.age > v; } });
var matched = data.filter(function (row) { return row.age !== null && row.age > v; });
resultEl.textContent = 'df[df["age"] > ' + v + '] β ' + matched.length + ' row' + (matched.length === 1 ? '' : 's') + ' match';
captionEl.textContent = 'Boolean filtering: rows where the condition is False (or NaN) get dropped.';
});
renderTable(allRows(), {});
})();
</script>
</div>